1

我使用以下技术在通过自定义协议启动的 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在这两种情况下都正确给出了可执行文件的路径。这只是一个小测试。

任何帮助表示赞赏,亚历山大

4

1 回答 1

1

您错误地假设应用程序是从它所在的文件夹调用的。

您必须获取当前应用程序的路径,然后将其与配置文件的名称结合起来。例如:

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]);
    // ...
}
于 2014-03-17T21:27:52.727 回答