excepción de ejecución cuando se llama a la función DLL con parámetro en Inno Setup

StackOverflow https://stackoverflow.com/questions/957070

  •  12-09-2019
  •  | 
  •  

Pregunta

Estoy llamando con éxito una función en un archivo DLL de Inno Setup, sin embargo, al regresar me sale un error de tiempo de ejecución ... Excepción: violación de acceso en la dirección XXXXXXX. Escribe la dirección de XXXXXX.

La función se declara como:

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

Y se llama:

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

No hay ningún problema si cambio de la función de no tomar un parámetro. Todavía se produce si lo cambio de tomar un único parámetro entero o declarar como una función y cambiar la función de ser una función de vacío con un parámetro entero.

La función llamada de retorno no hace más que:

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

Solución

Hay una falta de coincidencia de las convenciones de llamada. O bien hacer la DLL función de uso stdcall así:

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

o cambiar la declaración de la función a utilizar en lugar de cdecl stdcall:

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

Otros consejos

Aunque de acuerdo con mghie (ver comentarios) no debe hacer una diferencia en este caso, es posible que desee utilizar en lugar de PChar String ya que sería el equivalente más exacto de la char* C-declaración.

String es un tipo Pascal-nativa que por lo general se gestiona de manera muy diferente que un PChar (aunque aparentemente no tanto en PascalScript de Inno).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top