c++应用程序根时使用自定义协议
C++ Application root when using custom protocol
我在windows上创建了一个c++应用程序,它通过自定义协议启动,使用以下技术:http://msdn.microsoft.com/en-us/library/ie/aa767914(v=vs.85).aspx。
它使用ifstream加载配置文件,该文件与可执行文件位于同一文件夹中。所以如果我用相对路径(ifstream myfile ("config.cfg");
)效果很好。但是如果我在IE中使用自定义协议调用我的应用程序,像这样:myprotocol:\
,当我执行相同的可执行文件时,它无法加载文件。
有人能向我解释为什么我的程序在通过自定义协议执行时表现不同,以及我应该如何使我的应用程序加载文件而不必使用绝对路径?
int main(int argc, char* argv[])
{
wchar_t buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
std::wcout << buffer;
std::string line;
std::ifstream file ("config.cfg);
if(file.is_open())
{
std::cout << "Succes";
}
else
{
std::cout << "Could not load file";
return -1;
}
return 0;
}
GetModuleFileName
在两种情况下都正确给出了可执行文件的路径。这只是一个小测试。
感谢任何帮助,亚历山大
您错误地认为应用程序是从它所在的文件夹中调用的。
您必须获得当前应用程序的路径,然后将其与配置文件的名称组合。例如:
char buffer[MAX_PATH];
GetModuleFileNameA( NULL, buffer, MAX_PATH );
PathRemoveFileSpecA(buffer);
char cfg_path[MAX_PATH];
PathCombineA(cfg_path, MAX_PATH, buffer, "config.cfg");
// cfg_path now contains the full path to the config file
另一种解决方案是将路径作为应用程序的第一个参数传递给配置文件。这意味着将注册表中的命令更改为"C:Program FilesMyProtocolMyProtocol.exe" "C:Program FilesMyProtocolconfig.cfg" "%1"
之类的命令。然后可以将代码更改为以下内容:
int main(int argc, char* argv[]) {
if( argc<2 ) return -1;
std::ifstream file(argv[1]);
// ...
}
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 如何自定义wxApp来实现协议
- QtWebkit:如何处理自定义协议
- 在 C++ 中填充重复的自定义协议缓冲区字段
- 谷歌协议缓冲区,如何设置自定义类型的字段
- 处理协议插件中的自定义选项
- 为分布式系统构建了一个自定义的C++通信协议
- 在microtik Winbox的注册表编辑器中添加自定义协议
- 如何构建自定义libcurl只支持HTTP / HTTPS协议
- c++应用程序根时使用自定义协议