Исключение во время выполнения при вызове функции dll с параметром в Inno Setup - PullRequest
6 голосов
/ 05 июня 2009

Я успешно вызываю функцию в DLL из Inno Setup, однако по возвращении я получаю ошибку времени выполнения ... Исключение: нарушение доступа по адресу 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;

Нет проблем, если я изменю функцию, чтобы не принимать параметр. Это по-прежнему происходит, если я изменяю его на один целочисленный параметр или объявляю его как функцию и заменяю функцию на пустую функцию с целочисленным параметром.

Вызванная функция ничего не делает, кроме как возвращает:

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

Ответы [ 2 ]

9 голосов
/ 05 июня 2009

У вас несоответствие соглашений о вызовах. Либо заставьте функцию 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';
2 голосов
/ 08 июня 2009

Хотя, согласно mghie (см. Комментарии), в этом случае это не должно иметь значения, вы можете использовать PChar вместо String, поскольку это было бы более точным эквивалентом C-декларации char*.

String - это родной для Паскаля тип, который обычно управляется совсем не так, как PChar (хотя, очевидно, не так сильно в PascalScript Inno).

...