提问人:Mark Di Val 提问时间:8/26/2022 最后编辑:Mark Di Val 更新时间:8/26/2022 访问量:83
C++ Builder ExeName & ParamStr(0) 与相对最终输出目录设置
C++Builder ExeName & ParamStr(0) with relative Final output directory setting
问:
我编写了一个测试应用程序来调查将最终输出目录设置为 Application->ExeName 和 ParamStr(0) 上项目文件目录树之外的位置的影响。
我观察到的情况如下。
如果最终输出目录是相对路径(默认值为 .\$(Platform)\$(Config)),则会将其追加到项目文件路径。
对于我的测试项目文件: C:\Project\Suite\Project1\Project1.cbproj 这将导致 ExeName & ParamStr(0) = C:\Project\Suite\Project1\.\Win32\Debug\Project1.exe。
同样,这是在调试器下。选择“运行(不调试)”或在 IDE 外部运行,这两个都将具有正确的值:C:\Project\Suite\Project1\Win32\Debug\Project1.exe。
如果我将最终输出目录设置为: ..\target\$(平台)\$(配置) 要将 exe 放在以下目录中, C:\Project\Suite\Target\Win32\Debug ExeName 和 ParamStr(0) 的结果值 = C:\Project\Suite\Project1\.\..\Win32\Debug\Project1.exe 这显然没有帮助,因为 Project1.exe 使用 ExeName 来确定 exe 所在的目录,以及保存各种共享配置和应用程序特定文件的相关目录。
在启动时使用 GetCurrDir() 而不是 ExeName 是一种可能的解决方法。我已经对此进行了测试,无论程序是否通过调试运行,它似乎都能正常工作。
这样做的原因是套件中有几个动态和静态库以及可执行程序 - Project2、Project3 等。将 .dll 和 .exe 文件编译到一个公共位置允许共享应用程序支持文件的单个位置。
也可以在最终输出目录中设置绝对路径。这样做将导致 ExeName 和 ParamStr(0) 值正确,但是,当其他人将套件加载到他们的计算机上时,他们可能不会将其放在完全相同的路径中。目前,该套件可以放置在任何地方,开发人员无需更改任何路径设置即可构建所有套件。
更新:除了 ExeName 问题之外,调试在此“外部”目录中使用 .dll 的 exe 无法发生,因为在具有错误 ExeName 的调试器下,可执行文件找不到 .dll,尽管它们位于该文件夹中。“运行(不调试)”也无法找到 .dll 文件。从外部 IDE 运行此 .exe 有效。将工作目录设置为目标 .exe 路径(绝对)有效。使用亲戚是行不通的。
最好知道为什么 IDE 会以这种方式运行,以及这是否是可以改进的地方,或者是否有其他方法可以解决这个问题。
答: 暂无答案
评论
TApplication::ExeName
只是调用 ,而 又只是调用 ,它报告创建调用进程的模块的完整路径,正如操作系统所知道的那样。因此,路径应始终有效且准确。它是否包含额外的和在里面是另一回事。ParamStr(0)
GetModuleFileName(NULL)
.
..
function TApplication.GetExeName: string; begin Result := ParamStr(0); end;
function ParamStr(Index: Integer): string; var ... Buffer: array[0..260] of Char; begin Result := ''; if Index = 0 then SetString(Result, Buffer, GetModuleFileName(0, Buffer, Length(Buffer))) else ... end;
"GetModuleFileName(0)