使用自定义协议(protocol)时的 C++ 应用程序根目录

标签 c++ ifstream working-directory custom-protocol

我在 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/

相关文章:

c++ - gfortran makefile 问题

c++ - 使用 C 或 C++ 以八进制形式使用 sscanf 在 char 数组中发出读取

c++ - 从 .txt 文件中读取一行并插入到变量中

c++ - 无法让简单的 ifstream 在 Visual Studio Express 中工作

rust - 为什么我的 Rust 代码没有进入上述目录?

powershell - 用于更改从 powershell 中运行的目录的批处理文件不执行任何操作

c++ - 为什么要在类中创建函数指针结构?

c++ - 如何比较 const char* 与 C++ 中的字符串?

c++ - 带有通配符的 ifstream