Necesito devolver un valor de cadena a la secuencia de comandos inno setup. El problema es que no puedo encontrar una forma de administrar la memoria asignada. Si asigno en el lado de la DLL, no tengo que desasignar nada en el lado del script. No puedo usar un parámetro de salida porque tampoco hay una función de asignación en Pascal Script. ¿Que debería hacer?¿Cómo devolver una cadena de un archivo DLL a Inno Setup?
Respuesta
Aquí hay un código de ejemplo de cómo asignar una cadena que regresa de una DLL:
[code]
Function GetClassNameA(hWnd: Integer; lpClassName: PChar; nMaxCount: Integer): Integer;
External '[email protected] 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;
La única forma práctica de hacerlo es asignar una cadena en la configuración de Inno, y pasar un puntero a eso junto con la longitud de su DLL que luego escribe hasta el valor de longitud antes de volver.
Aquí hay un código de ejemplo taken from the newsgroup.
function GetWindowsDirectoryA(Buffer: AnsiString; Size: Cardinal): Cardinal;
external '[email protected] stdcall';
function GetWindowsDirectoryW(Buffer: String; Size: Cardinal): Cardinal;
external '[email protected] 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;
Véase también this thread de más hasta la fecha discusión.
¿Cómo se asignan en Inno Setup? –
SetLength (StrVar, SomeLength); –
La respuesta se ha actualizado con un ejemplo. – Deanna
Una solución muy simple para el caso en que la función DLL se llama una sola vez en la instalación - usa un buffer global en tu dll para la cadena.
lado 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;
}
lado Inno-Setup:
function MyFunc: PChar;
external '[email protected]:mydll.dll cdecl';
Me encanta esta simple respuesta, es útil cuando escribe una extensión DLL especialmente para Inno Setup. En este caso, puede ignorar el soporte faltante para la seguridad de reingreso que proviene del uso de un buffer global. – blerontin
- 1. Cómo registrar una .NET DLL usando Inno Setup
- 2. ¿Cómo puedo llamar a una DLL .NET desde una secuencia de comandos Inno Setup?
- 3. Usando Inno Setup, ¿cómo importar un archivo .cer de certificado?
- 4. Inno Setup Renombrar archivo durante el embalaje
- 5. ¿Cómo puedo usar GetVolumeInformation en Inno Setup?
- 6. Inno-setup 32bit y 64bit en uno
- 7. Inno Setup página personalizada
- 8. Cómo firmar digitalmente el archivo de desinstalación generado Inno Setup?
- 9. Instalar un archivo redistribuible adicional con Inno Setup
- 10. Hook estándar Inno Setup checkbox
- 11. Crear un usuario restringido desde Inno Setup
- 12. ¿Cómo manejar el archivo .msi con Inno Setup?
- 13. Inno Setup: ¿Cómo veo la salida (traducción) del preprocesador Inno Setup?
- 14. Ejecutar código personalizado a través de tareas en Inno Setup
- 15. Inno Setup Instalación y configuración de IIS
- 16. ¿Inno Setup para el servicio de Windows?
- 17. ¿Cómo se muestra un hipervínculo en Inno Setup?
- 18. Inno Setup: cómo definir una matriz en const?
- 19. ¿Puede un script Inno-Setup ISS incluir un archivo de script ISS externo?
- 20. ¿Es posible llamar a un archivo por lotes mientras se compila un script Inno Setup?
- 21. Salir de Inno Setup Instalación desde [código]
- 22. Cómo agregar una tarea programada con Inno Setup
- 23. ¿Cómo generar un nuevo GUID en Inno Setup?
- 24. Inno Setup - #define directive - cómo usar la variable previamente definida?
- 25. Instalación de varias aplicaciones a la vez desde Inno Setup
- 26. Ejecutar otro instalador en una instalación de Inno Setup
- 27. ¿Cómo puedo iniciar sesión en las instalaciones de Inno Setup?
- 28. Script Inno Setup para copiar carpetas
- 29. ¿Cómo puedo hacer que Inno Setup ignore los directorios vacíos?
- 30. Inno Setup Comprobación del proceso en ejecución
hace esta pregunta usted pregunta? – kobik
Sí, lo siento, estuve fuera del trabajo por unos días (y el fin de semana). Aceptado y gracias. –