c++应用程序根时使用自定义协议

C++ Application root when using custom protocol

本文关键字:自定义 协议 应用程序 c++      更新时间:2023-10-16

我在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]);
    // ...
}