我需要向调用 Inno Setup 脚本返回一个字符串值。问题是我找不到管理分配内存的方法。如果我在 DLL 端分配,我在脚本端没有任何可释放的东西。我不能使用输出参数,因为 Pascal 脚本中也没有分配函数。我该怎么办?
问问题
4723 次
3 回答
7
以下是如何分配从 DLL 返回的字符串的示例代码:
[Code]
Function GetClassNameA(hWnd: Integer; lpClassName: PChar; nMaxCount: Integer): Integer;
External 'GetClassNameA@User32.dll StdCall';
function GetClassName(hWnd: Integer): string;
var
ClassName: String;
Ret: Integer;
begin
{ allocate enough memory (pascal script will deallocate the string) }
SetLength(ClassName, 256);
{ the DLL returns the number of characters copied to the buffer }
Ret := GetClassNameA(hWnd, PChar(ClassName), 256);
{ adjust new size }
Result := Copy(ClassName, 1 , Ret);
end;
于 2012-03-13T17:23:07.043 回答
4
对于在安装中仅调用一次 DLL 函数的情况,一个非常简单的解决方案- 在您的 dll 中为字符串使用全局缓冲区。
DLL端:
char g_myFuncResult[256];
extern "C" __declspec(dllexport) const char* MyFunc()
{
doSomeStuff(g_myFuncResult); // This part varies depending on myFunc's purpose
return g_myFuncResult;
}
Inno-Setup 方面:
function MyFunc: PChar;
external 'MyFunc@files:mydll.dll cdecl';
于 2014-03-09T12:13:18.100 回答
3
唯一可行的方法是在 Inno Setup 中分配一个字符串,并将指向该字符串的指针连同长度一起传递给您的 DLL,然后在返回之前将其写入长度值。
这是取自新闻组的一些示例代码。
function GetWindowsDirectoryA(Buffer: AnsiString; Size: Cardinal): Cardinal;
external 'GetWindowsDirectoryA@kernel32.dll stdcall';
function GetWindowsDirectoryW(Buffer: String; Size: Cardinal): Cardinal;
external 'GetWindowsDirectoryW@kernel32.dll stdcall';
function NextButtonClick(CurPage: Integer): Boolean;
var
BufferA: AnsiString;
BufferW: String;
begin
SetLength(BufferA, 256);
SetLength(BufferA, GetWindowsDirectoryA(BufferA, 256));
MsgBox(BufferA, mbInformation, mb_Ok);
SetLength(BufferW, 256);
SetLength(BufferW, GetWindowsDirectoryW(BufferW, 256));
MsgBox(BufferW, mbInformation, mb_Ok);
end;
另请参阅此线程以获取更多最新讨论。
于 2012-03-13T16:19:00.240 回答