Devo restituire un valore stringa allo script di chiamata inno setup. Il problema è che non riesco a trovare un modo per gestire la memoria allocata. Se alloco sul lato DLL, non ho nulla da deallocare sul lato script. Non riesco a utilizzare un parametro di output, perché non esiste alcuna funzione di allocazione in Pascal Script. Cosa dovrei fare?Come restituire una stringa da una DLL a Inno Setup?
risposta
Ecco un codice di esempio di come allocare una stringa che ritorna da 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;
L'unico modo pratico per eseguire questa operazione consiste nell'assegnare una stringa in Inno Setup e passare un puntatore a quello insieme alla lunghezza della DLL che quindi scrive fino al valore della lunghezza prima di tornare.
Ecco alcuni esempi di codice 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;
vedono anche this thread per più aggiornate discussione.
Come posso assegnarlo a Inno Setup? –
SetLength (StrVar, SomeLength); –
La risposta è stata aggiornata con un esempio. – Deanna
una soluzione molto semplice per il caso in cui la funzione di DLL viene chiamato una sola volta nell'installazione - utilizzare un buffer globale nella DLL per la stringa.
lato 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;
}
lato Inno-Setup:
function MyFunc: PChar;
external '[email protected]:mydll.dll cdecl';
Mi piace questa semplice risposta, è utile quando si scrive una DLL di estensione soprattutto per Inno Setup. In questo caso è possibile ignorare il supporto mancante per la sicurezza di rientro che deriva dall'utilizzo di un buffer globale. – blerontin
- 1. Chiama DLL C# da Inno Setup con callback
- 2. Inno Setup installazione dll a 32 bit e 64 bit
- 3. Converti booleano in stringa con Inno Setup
- 4. Inno Setup: come passare la variabile da [Codice] a [Esegui]
- 5. Uscita da Inno Setup Installazione da [code]
- 6. Errori Inno Setup RegAsm.exe
- 7. Come posso utilizzare GetVolumeInformation in Inno Setup?
- 8. Inno Setup: come definire una matrice in const?
- 9. Inno Setup: utilizzo di JSON
- 10. È necessario sovrascrivere una DLL in inno setup installer - ma il file non viene sostituito
- 11. Inno setup - percorso relativo a ReadIni
- 12. Rhino: come restituire una stringa da Java a Javascript?
- 13. Come posso passare una stringa Delphi a una DLL Prism?
- 14. Riferimento a una DLL da un'altra DLL
- 15. Come posso restituire una stringa formattata da una funzione?
- 16. Inno Setup: Come posso vedere l'output (traduzione) del preprocessore di Inno Setup?
- 17. Impostazione della didascalia Unicode da una stringa DLL DLL Tabella
- 18. Modo corretto per restituire una stringa da una funzione
- 19. Installazione di più applicazioni contemporaneamente da Inno Setup
- 20. come accedere a una classe da una DLL in python?
- 21. Inno Setup Associazione file opzionale (selezionabile dall'utente)
- 22. Script Inno Setup per copiare le cartelle
- 23. Inno Setup Installazione e configurazione di IIS
- 24. come restituire una funzione clojure come stringa
- 25. Come restituire un valore Enum da una stringa?
- 26. Inno Setup Rinomina file durante l'imballaggio
- 27. Inno-Setup: Disinstalla senza privilegio di amministratore
- 28. Inno Setup installazione predefinita cambio cartella
- 29. Inno-setup 32 bit e 64 bit in uno
- 30. Inno Setup: Aggiungi un campo di inserimento personalizzato
risponde a questa domanda? – kobik
Sì, scusate, ero fuori dal lavoro per alcuni giorni (e il fine settimana). Accettato e grazie. –