2012-09-17 93 views
1

我有了许多不同的操作系统(多操作系统)获取可执行文件路径

二进制程序

我需要得到二进制(认为自动更新)的位置

怎么做的'你的'操作系统?

(把它看成是的,各种各样:)一个挑战)

编辑注:程序可以是便携式(流掉闪存驱动器等)或安装(如最初在.deb文件格式)

EDIT2:这里是我已经:

/** 
* Get the location of the executable 
* @return the location of the executable, as a string. 
*/ 
const char *GetExecutableLocation() 
{ 
    const char *path; 
    char buf[1024]; 

    #if defined (WIN32) || defined (WIN64) 
     GetModuleFileName(path, &size); 
    #elif defined (__APPLE__) 
     _NSGetExecutablePath(path, &size); 
    #elif defined(UNIX) 
     if (readlink("/proc/self/exe", buf, sizeof(buf)) == -1) path = buf; 
    #elif defined(__FreeBSD__) 
     int mib[4]; 
     mib[0] = CTL_KERN; 
     mib[1] = KERN_PROC; 
     mib[2] = KERN_PROC_PATHNAME; 
     mib[3] = -1; 
     sysctl(mib, 4, buf, sizeof(buf), NULL, 0); 
     path = buf; 
    #elif defined(SUNOS) 
     path = getexecname(); 
    #endif 
    return path; 
} 

(请注意,我只测试了Unix的部分,我不知道别的)

+0

可能是'argv [0]''可能? –

回答

3

没有可移植的方法。

主操作系统粗糙的想法(我在这里留下了详细说明):

  • 的Windows:调用GetModuleFileNameW(nullptr)来获取路径执行程序
  • 的MacOS:使用[[NSBundle mainBundle] bundlePath]获取主包目录(还有一个可执行文件本身的调用,但大多数时候你想要找到你的数据文件)。你需要将这部分编译为Objective-C++;我正在考虑使用CFBundle,但当时发现它太杂乱。
  • Linux:没有“真正的好”方法。我解决了readlink(/ proc/<mypid>/exe),这将在大多数情况下工作。当通过硬链接调用程序时,它将失败。

注:argv [0]通常是无用的;它提供了用于在控制台环境中调用程序的名称,但不解析shell搜索路径,并且在某些环境中可能不可用。它在Windows GUI程序中不存在,当您通过GUI运行该程序时,我甚至不知道MacOS通过了哪些argv [0]。

+0

谢谢你,我已经有类似的东西(http://pastebin.com/ffzzxPzi-我知道unix部分的作品,但除此之外,未知),并想知道如果人们有更多 – LordAro

相关问题