shellexec和c:\program files-x86和x64可移植性

shellexec和c:\program files-x86和x64可移植性,c,windows,C,Windows,我正在修改一个开源GUI(用c编写),以便在托盘应用程序中添加一个新的菜单项。新菜单项执行c:\program files目录下程序根目录中的文件(update.exe)。我正在使用shellexec(),它在x86上运行良好,但由于x64-c:\program files(x86)上的路径不同,因此无法加载。我想使用一些类似于%programfiles%的环境变量。什么是一个优雅的解决方案 或者,我可以更改update.exe文件的存储位置。将其放入“程序文件”似乎是最合乎逻辑的。对于上面的问

我正在修改一个开源GUI(用c编写),以便在托盘应用程序中添加一个新的菜单项。新菜单项执行c:\program files目录下程序根目录中的文件(update.exe)。我正在使用shellexec(),它在x86上运行良好,但由于x64-c:\program files(x86)上的路径不同,因此无法加载。我想使用一些类似于%programfiles%的环境变量。什么是一个优雅的解决方案

或者,我可以更改update.exe文件的存储位置。将其放入“程序文件”似乎是最合乎逻辑的。对于上面的问题,它是否应该超出程序文件?如果是,在哪里?

您可以使用来检索可执行文件的完整路径。然后,您只需从末尾剪切文件名,就可以得到完整的目录路径

像这样的东西应该是关键:

TCHAR szPath[MAX_PATH];
LPTSTR szFileName;

GetModuleFileName(g_hInstance, szPath, sizeof(szPath)/sizeof(TCHAR));
szFileName = _tcsrchr(szPath, TEXT("\\"));
*szFileName = TEXT('\0');

// szPath now contains the path

(警告!未测试!)

这是32位应用程序的自动文件系统重定向。尝试更好地诊断“加载失败”。在x64上,调用的应用程序根本不加载,我假设是因为由于路径不同而找不到它。如果发生文件重定向,则会失败。但是,如果程序的目录是program Files(x86),系统将重新映射该目录,并告诉您“program Files”。现在,您可以说,在启动任何命令提示之前,您可以将
SetCurrentDirectory
设置为程序的目录。。。