我需要为包含的 3rd 方库设置两个环境变量(当我的应用程序运行时)。
问题是“那样”它不起作用,但是当我运行控制台应用程序时,设置这两个变量然后运行应用程序,一切正常......
如何正确配置这两个变量?
我使用的程序:
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;
Run Code Online (Sandbox Code Playgroud)
它返回 0
也许问题是,我在应用程序启动时加载了库。当我的应用程序启动时,我设置了变量,但我这样做太晚了......?
更多信息
我在 dpr 中包含了两个单元:
'C:\Program Files (x86)\Borland\Delphi7\Lib\Magick\magick\ImageMagick.pas' 中的 ImageMagick,'C:\Program Files (x86)\Borland\Delphi7\Lib\Magick\wand\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.
Run Code Online (Sandbox Code Playgroud)
该单位位于 dpr 文件的开头。
从我从您的更新中可以看出,有问题的第三方库是 ImageMagick。并且该库的 .pas 包装器使用加载时链接到 ImageMagick DLL。
当您从命令解释器修改环境变量,然后启动您的进程时,ImageMagick DLL 可以看到这些环境变量。当您在进程启动代码中修改环境变量时,ImageMagick DLL 无法看到这些环境变量。大概是因为它在您的代码修改它们之前已经读取了变量。
我从上面得出的结论是 ImageMagick DLL 在其初始化时正在读取环境变量。
因为您使用的是加载时链接,所以 DLL 初始化发生在您有机会执行您的代码之前。我可以想到以下方法来解决这个问题:
delayed指令添加到函数声明中。这会导致运行时链接。main函数。在我看来,在这些选项中,第一个是迄今为止最可取的。