我需要返回一個字符串值到調用inno安裝腳本。問題是我找不到管理分配內存的方法。如果我在DLL端分配,我沒有任何東西可以在腳本端解除分配。我不能使用輸出參數,因爲在Pascal腳本中也沒有分配函數。我該怎麼辦?如何從DLL返回一個字符串到Inno安裝程序?
回答
下面是如何分配是從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 setup中分配一個字符串,並將指針和長度傳遞給您的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 Setup的分配呢? – 2012-03-13 16:47:35
SetLength(StrVar,SomeLength); – 2012-03-14 02:24:54
答案已經更新了一個例子。 – Deanna 2012-03-14 10:26:45
一個非常簡單的解決方案的情況下DLL函數被調用一次在安裝 - 在你的dll中使用全局緩衝區作爲字符串。
DLL的一面:
的Inno-安裝側:
function MyFunc: PChar;
external '[email protected]:mydll.dll cdecl';
我喜歡這個簡單的答案,當你編寫擴展DLL尤其是Inno Setup時,這很有幫助。在這種情況下,您可以忽略來自使用全局緩衝區的重新進入安全的缺失支持。 – blerontin 2015-11-18 13:54:34
- 1. Inno安裝程序 - 如何用字符串替換UserName
- 2. Inno安裝程序無法導入DLL
- 3. 從非託管C++ dll到c返回一個字符串#
- 4. 從線程返回一個「字符串」
- 5. 用Inno Setup安裝程序安裝Windows shell擴展DLL
- 6. Inno安裝程序訪問字符串違規增量數組
- 7. Inno安裝程序讀取註冊表給出空字符串
- 8. 如何使用inno安裝程序安裝字體
- 9. 從處理程序。返回一個字符串從服務
- 10. 建立一個安裝程序,用MSBuild安裝dll到gac
- 11. 在Inno Setup安裝中運行另一個安裝程序
- 12. Inno Setup - 用於多個安裝程序的安裝程序
- 13. 從rpgle程序返回字符串
- 14. INNO安裝驅動程序已安裝
- 15. 如何在Inno中創建一個Delphi安裝程序
- 16. Inno Setup - 讓Inno安裝程序安裝程序向主安裝程序報告安裝進度狀態
- 17. 返回C字符串到C#程序
- 18. Rhino:如何從Java返回一個字符串到Javascript?
- 19. 找到一個字符串,但返回前一個字符串
- 20. 如何返回一個字符串?
- 21. 如何返回一個字符串arrayList
- 22. C++ DLL只返回VB應用程序的第一個字符
- 23. 從Inno Setup一次安裝多個應用程序
- 24. python程序讀取一個字符串,並返回另一個字符串
- 25. 如何從一個lambda函數返回一個字符串?
- 26. 如何從C++ dll向InstallScript返回unicode字符串/ wstring/CStringW?
- 27. 返回double *從C++ dll到delphi程序
- 28. 返回一個字符串數組從
- 29. 製作一個數字拼寫程序,從函數返回一個字符串
- 30. 返回一個字符串
對此問題回答你的問題? – kobik 2012-03-17 14:07:35
是的,對不起,我幾天(和週末)都離開了工作。接受並感謝你。 – 2012-03-19 08:31:57