8

呼び出し元の Inno Setup スクリプトに文字列値を返す必要があります。問題は、割り当てられたメモリを管理する方法が見つからないことです。DLL 側で割り当てた場合、スクリプト側で割り当てを解除するものは何もありません。Pascal Script にも割り当て関数がないため、出力パラメーターを使用できません。私は何をすべきか?

4

3 に答える 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 関数が 1 回だけ呼び出される場合の非常に簡単な解決策は、文字列用に 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 に渡し、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 に答える