我的可执行文件在这个地方-> 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;
}