6

Inno Setup から DLL 内の関数を正常に呼び出していますが、戻るとランタイム エラーが発生します...例外: アドレス XXXXXXX でアクセス違反が発生します。アドレス XXXXXX の書き込み。

関数は次のように宣言されます。

function CompleteInstall(szIntallPath: String) :  Integer;
external 'CompleteInstall@files:InstallHelper.dll stdcall setuponly';

そして呼び出されました:

procedure CurStepChanged(CurStep: TSetupStep);
begin
   if CurStep = ssPostInstall then begin
      CompleteInstall('Parm1'); // ExpandConstant('{app}')
   end;
end;

パラメータを取らない関数に変更しても問題ありません。単一の整数パラメーターを取るように変更するか、関数として宣言し、関数を整数パラメーターを持つ void 関数に変更すると、引き続き発生します。

呼び出された関数は何もせず、次を返します。

__declspec(dllexport) int CompleteInstall(char* szInstallPath)
{
    //AfxMessageBox ("Got here" /*szInstallPath*/, MB_OK);
    return 1;
}
4

2 に答える 2

9

呼び出し規約に不一致があります。DLL関数も使用するstdcallようにします。

__declspec(dllexport) __stdcall int CompleteInstall(char* szInstallPath)
{
    //AfxMessageBox ("Got here" /*szInstallPath*/, MB_OK);
    return 1;
}

または、関数宣言を次cdeclの代わりに使用するように変更しstdcallます。

function CompleteInstall(szIntallPath: String) : Integer;
    external 'CompleteInstall@files:InstallHelper.dll cdecl setuponly';
于 2009-06-05T17:31:13.820 に答える
2

mghie(コメントを参照)によると、この場合は違いはありませんが、C宣言とより正確に同等であるため、PChar代わりに使用することをお勧めします。Stringchar*

StringはPascalネイティブ型であり、通常はaとはまったく異なる方法で管理されますPChar(ただし、InnoのPascalScriptではそれほど多くはないようです)。

于 2009-06-07T23:35:17.157 に答える