我在 Windows 上创建了一个 C++ 应用程序,该应用程序使用以下技术通过自定义协议(protocol)启动:http://msdn.microsoft.com/en-us/library/ie/aa767914(v=vs.85).aspx .
它使用 ifstream 加载一个配置文件,该文件位于与可执行文件相同的文件夹中。因此,如果我使用相对路径 (ifstream myfile ("config.cfg");
),它的效果非常好。但是,如果我在 IE 中使用自定义协议(protocol)调用我的应用程序,如下所示:myprotocol:\\
它无法在我执行相同的可执行文件时加载文件。
有人可以向我解释为什么我的程序在通过自定义协议(protocol)执行时表现不同,以及我应该如何使我的应用程序加载文件而不必使用绝对路径?
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 Files\MyProtocol\MyProtocol.exe""C:\Program Files\MyProtocol\config.cfg""%1"
的命令。那么代码可以改成如下:
int main(int argc, char* argv[]) {
if( argc<2 ) return -1;
std::ifstream file(argv[1]);
// ...
}
关于使用自定义协议(protocol)时的 C++ 应用程序根目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22461956/