c - 如何在 Windows 上使用 C 语言将 AppPath 获取到可执行文件的目录(使用 MinGW gcc )

标签 c path mingw shellexecute getmodulefilename

我的可执行文件在这个地方 --> D:\Examples\C_Pro\newApp.exe 同样在“C_Pro”文件夹中包含几个文件(file1.txt、file2.txt、file44.exe、newApp.c)

在我的 newApp.c 文件中,我包含一个 ShellExecute 函数来执行同一文件夹中的“file44.exe”文件,如下所示 --> ShellExecute(NULL,"open","D:\Examples\C_Pro\file44.exe ",NULL,NULL,1)

以这种方式一切正常..

我说的是 VB 中类似 AppPath 的东西

但实际情况是我想在不同的电脑上运行这个 newApp.exe 所以我想用另一台电脑中包含“newApp.exe”文件的任何路径替换“”D:\Examples\C_Pro\”。(如 C:\Software\)

我使用 GetModuleFileName 函数获取路径,但它包含 newApp.exe 部分 我只想要那个新目录 PathRemoveFileSpec 函数不起作用。

还有 GetModuleFileName 的返回路径,如 --> D:\Examples\C_Pro\newApp.exe 但是当我们将一些路径放入 ShellEcxecute 时,需要像这样的双 shalse(空格序列)--> D:\Examples\C_Pro\

我怎样才能摆脱这个问题。

实际的代码片段是这样的...

int main()
{
    ShellExecute(NULL,"open","D:\\Softwares\\TypingMaster700.exe",NULL,NULL,SW_SHOWNORMAL);
}

但我想这样做。 (这是一个虚拟函数,这里的“some_Funtion”是为了解释目的的虚拟函数。

int main()
{
    char *dirPath = some_Function(a,x,d);
    char *fullPath;
    fullPath = strcat(dirPath,"\\TypingMaster700.exe");
    ShellExecute(NULL,"open",fullPath,NULL,NULL,SW_SHOWNORMAL);
}

最佳答案

获取可执行文件所在目录的绝对路径在C标准中并不标准支持,因为并非所有程序运行的系统都支持这样的概念。然而在实践中这是一个理想的功能。简而言之:好问题。

不幸的是,它不是那么简单,如果您的程序是使用 execl c.s 调用的。这甚至可能是不可能的。您将不得不重播 shell 以确定要运行的应用程序并以 argv[0] 启动,就像 paulsm4 一样。在 Linux 上,如果路径以 / 开头,则 argv[0] 是可执行文件的绝对路径,您可以通过在末尾剥离可执行文件名称来找到目录.在 Windows 上,您必须检查 \ 和可能的驱动器号,我不确定。我们将在其余部分假设 Linux,只需阅读 \ 中的每个 / 即可将其应用于 Windows。

如果 argv[0] 不是上面的绝对路径,你应该检查它是否包含任何 /,因为如果包含它必须是相对的到 getcwd,正如 paulsm4 所描述的那样。

如果 argv[0] 不包含任何 /,那么您将不得不遍历 PATH 环境变量以找到第一个包含 argv[0] 的目录。

如果这一切都失败了,您的应用程序已通过 execl 或其 friend 之一调用,并且他们对可执行文件的位置不诚实。你真倒霉。

关于c - 如何在 Windows 上使用 C 语言将 AppPath 获取到可执行文件的目录(使用 MinGW gcc ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15776269/

相关文章:

c++ - 在 Windows 中使用 MinGW 的谷歌 Protocol Buffer

c - 在第二个对角线下打印矩阵和数字

c++ - 我们可以将 printf() 打印的值存储到 unsigned long 变量中吗?

python - 由于 Web 部署而将绝对路径更改为相对路径(Python - Flask)

Android:如何获取可绘制图像名称

c++ - Win7 和 Win10 之间的定时器差异

c - 指定线程访问数组中的哪些位置

c - 如何修复C语言中的 "Conditional jump or move depends on uninitialised value(s)"错误

java - 从父 Path 实例创建子 NIO.2 Path

c - msys2 如何显示来自非控制台应用程序的控制台输出?