2012-03-13 35 views
6

我需要返回一個字符串值到調用inno安裝腳本。問題是我找不到管理分配內存的方法。如果我在DLL端分配,我沒有任何東西可以在腳本端解除分配。我不能使用輸出參數,因爲在Pascal腳本中也沒有分配函數。我該怎麼辦?如何從DLL返回一個字符串到Inno安裝程序?

回答

7

下面是如何分配是從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; 
+0

對此問題回答你的問題? – kobik 2012-03-17 14:07:35

+0

是的,對不起,我幾天(和週末)都離開了工作。接受並感謝你。 – 2012-03-19 08:31:57

2

做到這一點的唯一可行的方法是在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更多最新討論。

+0

如何在Inno Setup的分配呢? – 2012-03-13 16:47:35

+0

SetLength(StrVar,SomeLength); – 2012-03-14 02:24:54

+0

答案已經更新了一個例子。 – Deanna 2012-03-14 10:26:45

2

一個非常簡單的解決方案的情況下DLL函數被調用一次在安裝 - 在你的dll中使用全局緩衝區作爲字符串。

DLL的一面:

​​

的Inno-安裝側:

function MyFunc: PChar; 
external '[email protected]:mydll.dll cdecl'; 
+1

我喜歡這個簡單的答案,當你編寫擴展DLL尤其是Inno Setup時,這很有幫助。在這種情況下,您可以忽略來自使用全局緩衝區的重新進入安全的缺失支持。 – blerontin 2015-11-18 13:54:34

相關問題