2012-02-15 52 views
4

誰能給我提供工作示例通過參數傳遞的字節 的任意數量的DLL函數的?傳遞二進制數據到一個DLL函數在D7

我想這樣做沒有任何額外的存儲單元,僅僅只對基本的Windows類型進行操作。

我需要爲每次通話「發送」大約300 kb的數據。

應在客戶端分配的內存是免費的也對客戶端?

+0

我們會的,但我們要看到,你試過的東西... – ComputerSaysNo 2012-02-15 15:40:57

+2

關於分配和釋放:要麼上的被叫方發送方或兩者兩者都做。所以如果你想在客戶端分配它,也可以在客戶端釋放它。 – 2012-02-15 16:03:45

回答

7

的DLL函數應該是這樣的:

procedure Test(Buffer: Pointer; Length: Integer); stdcall; 
begin 
    //Buffer points to the start of the buffer. 
    //The Buffer size if Length bytes. 
end; 

假設你從另一個德爾福模塊調用它的通話可能看起來像這樣:

procedure Test(Buffer: Pointer; Length: Integer); stdcall; external 'test.dll'; 

procedure CallTest; 
var 
    Buffer: array of Byte; 
begin 
    SetLength(Buffer, 1000); 
    //populate Buffer 
    Test(@Buffer[0], Length(Buffer)); 
end; 

它始終是最好定義一個接口這要求在同一模塊中分配和釋放內存。

上面的例子在調用者的模塊中分配和釋放。這意味着Test方法要麼在返回之前完全處理Buffer,要麼在返回之前獲取Buffer的內容的副本。

現在,雖然它可能有被叫方的模塊中的分配和釋放,這是不常見的。它不太常見,因爲這樣做通常不太方便。它通常需要更多的API函數,或者更復雜的界面。當調用者無法爲緩衝區確定合適的大小時,您將被推入被調用者分配的路由。

當數據正在從主叫方傳遞比呼叫者的被調用分配是總是最好的選擇。當數據以另一個方向流動時,被調用者分配的可能性會更大。

+3

你沒有說關於釋放的任何內容:由於'Buffer'是一個動態數組,因此當'CallTest'離開時它將被釋放。因此,如果DLL想要在Test測試調用之後保持數據,就必須製作自己的副本。 – 2012-02-15 15:59:44

+0

@JensMühlenhoff完全正確。謝謝。現在補充說明。 – 2012-02-15 16:05:42

+0

我認爲模塊分配應該在你從模塊函數中返回一個緩衝區然後在調用者函數中取消分配它(例如模塊中的LocalAlloc和調用者中的LocalFree)。 – kobik 2012-02-15 16:31:15