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 (请参阅评论),在这种情况下它不应该有所作为,但您可能希望使用PChar而不是,String因为这将是更准确的 C-declaration 等价物char*

String是一种 Pascal 原生类型,其管理方式通常与 a 完全不同PChar(尽管在 Inno 的 PascalScript 中显然没有那么多)。

于 2009-06-07T23:35:17.157 回答