我需要为包含的第三方库设置两个环境变量(当我的应用程序运行时)。
然而,问题在于“那种方式”不起作用 当我运行控制台应用程序时,设置这两个变量,然后运行应用程序,一切正常......
如何正确配置这两个变量?
我使用的程序:
function SetEnvVarValue(const VarName,
VarValue: string): Integer;
begin
// Simply call API function
if SetEnvironmentVariable(PChar(VarName),
PChar(VarValue)) then
Result := 0
else
Result := GetLastError;
end;
返回0
也许事情是,我在应用程序启动时加载了库。 当我的应用程序明星我设置变量,我做得太晚了??
更多信息
我在dpr中包含了两个单位:
ImageMagick在'C:\ Program Files(x86)\ Borland \ Delphi7 \ Lib \ Magick \ magick \ ImageMagick.pas'中, magick_wand在'C:\ Program Files(x86)\ Borland \ Delphi7 \ Lib \ Magick \ wand \ magick_wand.pas';
单位:
unit DoItFirst;
interface
uses
Windows, Sysutils;
var
s: string;
error: Integer;
function _putenv_s(const lpName, lpValue: PChar): BOOL; cdecl; external 'msvcrt.dll';
implementation
function GetEnvVarValue(const VarName: string): string;
var
BufSize: Integer; // buffer size required for value
begin
// Get required buffer size (inc. terminal #0)
BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
if BufSize > 0 then
begin
// Read env var value into result string
SetLength(Result, BufSize - 1);
GetEnvironmentVariable(PChar(VarName),
PChar(Result), BufSize);
end
else
// No such environment variable
Result := '';
end;
initialization
_putenv_s(PChar('DYLD_LIBRARY_PATH'), PChar('g:\_projekty\ZBar Test\'));
_putenv_s(PChar('MAGICK_CODER_MODULE_PATH'), PChar('g:\_projekty\ZBar Test\modules\coders\'));
s := GetEnvVarValue('DYLD_LIBRARY_PATH');
s := GetEnvVarValue('MAGICK_CODER_MODULE_PATH');
end.
此单元位于dpr文件的开头。
答案 0 :(得分:4)
在第三方库读取之后,您可能正在更改环境变量。
首先,你应该将环境变量设置为旅行计划的第一件事。
即便如此,可能是第三方库可能正在初始化函数中读取该信息,可能在您的代码开始运行之前。
如果是这种情况,我认为初始化顺序是确定性的(参见here),具体取决于dpr
(项目文件)中单位的顺序
如果您希望在第三方库之前设置这些变量,则可以创建DoMeFirst
单元并在该单元的init代码中执行。然后确保它是项目文件中的第一个。
如果这不起作用,另一种选择可能是编写一个改变环境的程序,然后然后将您当前的程序称为孩子。
答案 1 :(得分:4)
从我的更新中可以看出,第三方库是ImageMagick。该库的.pas包装器使用加载时链接到ImageMagick DLL。
从命令解释器修改环境变量,然后启动进程时,ImageMagick DLL可以看到这些环境变量。在流程启动代码中修改环境变量时,ImageMagick DLL无法看到这些环境变量。大概是因为它在代码修改之前已经读过变量。
我将从上面得出的结论是ImageMagick DLL正在初始化中读取环境变量。
因为您正在使用加载时链接,所以DLL初始化在您有机会执行代码之前发生。我可以想到以下解决问题的方法:
delayed
指令添加到函数声明中。这导致运行时链接。main
函数。在我看来,在这些选项中,第一个是最优选的。