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



我的可执行文件在这个地方-> D:ExamplesC_PronewApp.exe在"C_Pro"文件夹中还包含几个文件(file1.txt, file2.txt, file44.exe, newApp.c)

在我的newApp.c文件中,我包括一个ShellExecute函数来执行"file44.exe"文件在相同的文件夹中,像这样-> ShellExecute(NULL,"打开","D:ExamplesC_Profile44.exe",NULL,NULL,1)

这样就可以正常工作了。

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

但情况是我想在不同的pc上运行这个newApp.exe所以我想替换"D:ExamplesC_Pro",无论在另一台pc中包含"newApp.exe"文件的路径是什么。(如C:Software)

我使用GetModuleFileName函数获得路径,但它包含newApp.exe部分我只想在点到新目录PathRemoveFileSpec函数不工作

以及GetModuleFileName的返回路径,如--> D:ExamplesC_PronewApp.exe但是当我们在shellecexecute中放入一些路径时,需要像这样的双帧(空格序列)-> D:ExamplesC_Pro

我怎样才能解决这个问题呢?

实际代码片段如下:

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

但是我想这样做。(这是一个虚拟函数,这里的"some_function"表示用于解释的虚拟函数。

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或它的一个朋友调用,并且它们对可执行文件的位置不诚实。你运气不好。

类似的东西在Windows上运行:

#include <stdio.h>
#include <stdlib.h>
int
main (int argc, char *argv[])
{
  char buff[255];
  getcwd (buff, sizeof (buff));
  printf ("path=%s\%sn", buff, argv[0]);
  return 0;
}

相关内容

  • 没有找到相关文章

最新更新