gpt4 book ai didi

inno-setup - Pascal 脚本无法从自定义 DLL 中检索宽字符串

转载 作者:行者123 更新时间:2023-12-05 03:25:23 24 4
gpt4 key购买 nike

我需要 Inno Setup 从自定义 DLL 中的函数加载宽字符串。我加载 Ansi 字符串没有问题——例如,这个工作正常:

int __stdcall GetStringA(char *lpText)
{
StringCchCopyA(lpText, 30, "New Ansi value");
return strlen(lpText);
}

帕斯卡脚本

function GetStringA(lpText: AnsiString): Integer;
external 'GetStringA@files:MyDll.dll';

function LoadStringA(): AnsiString;
var
Str: AnsiString;
Length: Integer;
begin
Str := 'Initial Ansi value';
SetLength(Str, 30);
Length := GetStringA(Str);
SetLength(Str, Length);
Result := Str; // Str == 'New Ansi value'
end;

然而,用宽字符串做同样的事情失败了:

int __stdcall GetStringW(wchar_t *lpText)
{
StringCchCopyW(lpText, 30, L"New Wide value");
return wcslen(lpText);
}

帕斯卡脚本

function GetStringW(lpText: WideString): Integer;
external 'GetStringW@files:MyDll.dll';

function LoadStringW(): WideString;
var
Str: WideString;
Length: Integer;
begin
Str := 'Initial Wide value';
SetLength(Str, 30);
Length := GetStringW(Str); // ** DOES NOT ALTER 'Str' **
SetLength(Str, Length);
Result := Str; // Str == 'Initial Wide v' (old string, new length)
end;

发送 WideString DLL 工作正常。更改 DLL 中的缓冲区内容也能正常工作……但不知何故,这不会渗透回我的 Pascal 脚本变量。

怀疑在引擎盖下进行了某种编码(marshal)处理,因此 DLL 实际上操作了我的变量的副本。任何见解或解决方法表示赞赏!

我使用的是 Inno Setup 6.2.0。

最佳答案

我通过将 WideString 替换为 String 使其工作:

function GetStringW(lpText: String): Integer;
external 'GetStringW@files:MyDll.dll';

function LoadStringW(): WideString;
var
Str: String;
Length: Integer;
begin
Str := 'Initial Wide value';
SetLength(Str, 30);
Length := GetStringW(Str); // ** ALTERS 'Str' **
SetLength(Str, Length);
Result := Str; // Str == 'New Wide value'
end;

我原以为 WideStringString 是等价的,但显然不完全是。有必要更改函数原型(prototype)和 Str 声明。不必更改 LoadStringW 返回类型,尽管您可以 - 并且返回值在任何一种情况下都可以分配给 WideStringString 类型的变量 没有问题。

所以:问题解决了。不过,我仍然对潜在的行为感到好奇。

关于inno-setup - Pascal 脚本无法从自定义 DLL 中检索宽字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71999760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com