1

我的可执行文件在这个地方 --> 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 :\软件\ )

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

以及 GetModuleFileName 的返回路径,如 --> D:\Examples\C_Pro\newApp.exe 但是当我们将一些路径放入 ShellEcxecute 时,需要像这样的双字节(空格序列) --> 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);
}
4

2 回答 2

2

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

不幸的是,它并不是那么简单,如果你的程序是使用execlcs 调用的,它甚至可能是不可能的。在确定运行和启动哪个应用程序时,您必须重放 shell,argv[0]paulsm4 也是如此。在 Linux 上,如果路径以 开头/argv[0]则为可执行文件的绝对路径,您可以通过去除末尾的可执行文件名称来找到该目录。在 Windows 上,您将不得不检查\驱动器号,我不确定。我们将在其余部分假设 Linux,只需阅读\所有/内容即可将其应用于 Windows。

如果argv[0]不是上面的绝对路径,您应该检查它是否包含任何内容/,因为如果包含,则它必须是相对于getcwdpaulsm4 所描述的那样。

如果argv[0]不包含任何/,那么您将不得不运行PATH环境变量以找到包含argv[0].

如果这一切都失败了,则您的应用程序已通过execl或其朋友之一被调用,并且他们对可执行文件的位置不诚实。你运气不好。

于 2013-04-02T23:49:44.920 回答
1

像这样的东西适用于 Windows:

#include <stdio.h>
#include <stdlib.h>

int
main (int argc, char *argv[])
{
  char buff[255];
  getcwd (buff, sizeof (buff));
  printf ("path=%s\\%s\n", buff, argv[0]);
  return 0;
}
于 2013-04-02T23:32:49.277 回答