Мне нужно вернуть строковое значение сценарию вызова inno. Проблема в том, что я не могу найти способ управлять выделенной памятью. Если я выделяю на стороне DLL, мне нечего снимать со стороны скрипта. Я не могу использовать выходной параметр, потому что в скрипте Pascal нет функции распределения. Что мне делать?Как вернуть строку из DLL в Inno Setup?
ответ
Вот пример кода, как выделить строку, которая возвращает из 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;
Единственный практический способ сделать это - выделить строку в настройке Inno и передать указатель на нее вместе с длиной в DLL, которая затем записывает ее до значения длины перед возвратом.
Вот пример кода 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;
См. Также this thread для более подробной информации.
Как передать его в настройках Inno? –
SetLength (StrVar, SomeLength); –
Ответ был обновлен на примере. – Deanna
очень простое решение для случая, когда функция DLL вызывается только один раз в установке - используйте глобальный буфер в вашей dll для строки.
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;
}
сторона Inno-Setup:
function MyFunc: PChar;
external '[email protected]:mydll.dll cdecl';
Мне нравится этот простой ответ, это полезно, когда вы пишете DLL расширения, особенно для Inno Setup. В этом случае вы можете игнорировать недостающую поддержку безопасности повторного входа, которая исходит из глобального буфера. – blerontin
- 1. Как вернуть строку из DLL в Inno Setup Pascal Script
- 2. Inno Setup: удалите сервер Dll
- 3. Inno Setup: поместить DLL в подкаталог
- 4. Inno Setup Вставить DLL в uninstaller
- 5. C# DLL в Inno Setup Access Violation
- 6. Проблема с импортом DLL в Inno-Setup
- 7. Inno Setup 32bit и 64bit dll installation
- 8. Inno Setup - Как заменить UserName на строку
- 9. Вызов последовательных DLL из {tmp} в Inno Setup
- 10. Inno Setup не удалось импортировать DLL
- 11. Inno Setup Folders
- 12. Вызов C# DLL из Inno Setup с обратным вызовом
- 13. C# string to Inno Setup
- 14. Inno Setup: событие OnHover
- 15. Как передать «массив строк» от inno setup до Delphi Dll?
- 16. Inno Setup, как проверить наличие MSVCR100.dll в системе
- 17. Inno Setup: Условные FLAGS
- 18. Inno Setup - UrlCreateFromPath
- 19. Как Прервать Inno Setup
- 20. Inno Setup: Как посмотреть вывод (перевод) препроцессора Inno Setup?
- 21. Inno Setup StringChangeEx Failure
- 22. Inno Setup: Exec не может читать строку?
- 23. Inno Setup Версия Unicode и строковый параметр в Delphi DLL
- 24. Inno Setup Чтение реестра дает пустую строку
- 25. Inno setup installation
- 26. Inno Setup: WizardForm из внешней формы
- 27. Как изменить курсор мыши внутри Inno setup?
- 28. Как использовать GetVolumeInformation в Inno Setup?
- 29. Плагин Inno Setup Плагин Sqlite3
- 30. Как запустить cmd.exe, спрятанный в Inno Setup
это ответ на ваш вопрос? – kobik
Да, извините, я был вдали от работы на несколько дней (и на выходные). Принято и спасибо. –