【问题标题】:How to get the program path i am executing with "open with" method?如何使用“打开方式”方法获取我正在执行的程序路径?
【发布时间】:2010-02-06 15:58:44
【问题描述】:

我遇到的问题是我为我的文件使用相对路径,所以当我使用“打开方式”方法将文件打开到我的程序中时,我的所有路径都被搞砸了(它会在我所在的文件夹中创建我的文件使用了这种“打开方式”。)

我如何检索我用来通过“打开方式”方法打开文件的 .exe 文件的完整路径?

编辑:我的主要功能:

int WINAPI WinMain( HINSTANCE   hInstance,          // Instance
                    HINSTANCE   hPrevInstance,      // Previous Instance
                    LPSTR       lpCmdLine,          // Command Line Parameters
                    int         nCmdShow)           // Window Show State
{

【问题讨论】:

  • 我的猜测是您使用的是某种框架,而不是将 C++ Windows 应用程序写入原始 Windows API。哪一个?这对答案很重要。 (如果您正在完全由您自己编写,则它是您的main 函数中的argv[0]。)
  • 确实:/ 我更新了我的主函数,除了命令行之外,我没有看到任何其他参数......而且它甚至没有从文件名中去掉引号,我不得不自己去掉它。 . 也许我尝试使用 SDL main,但我想知道是否有可能在 WINAPI winmain() 上执行此操作。
  • 当心。你真的不应该在你的 EXE 所在的文件夹中创建文件。您应该将该文件夹视为只读;尽管自 Windows NT 以来一直如此,但操作系统在每个新的 Windows 版本中都更严格地执行它。使用临时目录 (GetTempPath) 或“应用程序设置”目录 (SHGetFolderName),这样管理员在安装您的程序时就不必做出特殊的例外。
  • @Newbie:实际上,真正的,最低级别的main(字面意思是函数的名称;WinMain 是另一回事),参数是int argc, char * argv[] 和@ 987654327@ 将是可执行文件的路径。但是(刷新失败的记忆)它不能保证被规范化,所以这对你没有用 - 不像下面两个实际 useful 答案。 :-)
  • “你真的不应该在你的 EXE 所在的文件夹中创建文件” 那么我应该如何创建一些应该被我的用户轻松复制的数据文件?像地图等...我不会把它们放在迷宫般的窗户路径中,我讨厌找到那些路径。每个 Windows 版本都有自己的路径。当你重新安装windows时,你会丢失所有东西,但是如果文件在程序文件夹中,你不会丢失它们(假设你没有在windows分区中安装程序......)

标签: c++ windows command-line


【解决方案1】:

GetModuleFileName 将为您提供可执行文件的绝对路径:

wchar_t executablePath[MAX_PATH];
if(GetModuleFileNameW(NULL, executablePath, MAX_PATH) == 0) { ... error ... }
else { ... find out executable path and set cwd ... }

【讨论】:

    【解决方案2】:
    #include <windows.h>
    #include <string>
    #include <iostream>
    using namespace std;;
    
    string ExePath() {
        char buffer[MAX_PATH];
        GetModuleFileName( NULL, buffer, MAX_PATH );
        string::size_type pos = string( buffer ).find_last_of( "\\/" );
        if ( pos == string::npos ) {
            return "";
        else {
            return string( buffer ).substr( 0, pos);
        }
    }
    
    int main() {
        cout << "executable path is " << ExePath() << "\n";
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多