每種程式語言呼叫dll的方法都不盡相同,在此只對用c#呼叫delphi dll的方法進行介紹
首先要搞清楚一點的是:什麼是託管,什麼是非託管?
一般可以認為:非託管**主要是基於win 32平台開發的dll,activex的元件,託管**是基於.net平台開發的
c# 呼叫dll中的非託管函式一般方法
首先,應該在c#語言源程式中宣告外部方法,其基本形式是:
[dllimport(「dll檔案」)]
修飾符 extern 返回變數型別 方法名稱 (引數列表)
其中:dll檔案:包含定義外部方法的庫檔案。
修飾符: 訪問修飾符,除了abstract以外在宣告方法時可以使用的修飾符。
返回變數型別:在dll檔案中你需呼叫方法的返回變數型別。
方法名稱:在dll檔案中你需呼叫方法的名稱。
引數列表:在dll檔案中你需呼叫方法的列表。
注意:需要在程式宣告中使用system.runtime.interopservices命名空間。
dllimport只能放置在方法宣告上。
dll檔案必須位於程式當前目錄或系統定義的查詢路徑中(即:系統環境變數中path所設定的路徑)。
返回變數型別、方法名稱、引數列表一定要與dll檔案中的定義相一致。
下面結合示例如:
[dllimport("testdll.dll", entrypoint = "sayhello")] "testdll.dll"為dll名稱,entrypoint 為函式名
static extern string sayhello(string name); //delphi 中的函式
private string getmessage() //c#自己寫的函式,並呼叫dll函式
當前程式中呼叫 getmessage時就會返回dll sayhello 函式的內容
其中,dll sayhello函式如下(delphi語言):
function sayhello(nametool:pchar):pchar;stdcall;
begin
if length(nametool) <=0 then
result := pchar('hello person,welcome to chian.')
else
result := pchar('hello '+ nametool + ', welcome to chian.');
end;
另外,如果需要呼叫傳值,的方法時,通過delphi的引數 var 與c#中的ref關鍵字結合使用如:
procedure changenumber(var number:integer);stdcall;
begin
number := 100;
end;
c#呼叫如下:
private int mynumber = 150;
[dllimport("testdll.dll", entrypoint = "changenumber")]
static extern void changenumber(ref int count);
private void changes()
當c#程式中呼叫 changes方法後,mynumber的值將會改變為100
以上為c#簡單呼叫delphi dll的方法。其中要注意的有:
dll檔案必須位於程式當前目錄或系統定義的查詢路徑中(即:系統環境變數中path所設定的路徑)。
返回變數型別、方法名稱、引數列表一定要與dll檔案中的定義相一致。
delphi DLL動態鏈結庫
假設有兩個應用程式,它們都要呼叫乙個單元中的乙個方法,那麼這兩個應用程式都要在uses語句中引用該單元。如果同時執行這兩個應用程式,這個方法就會在記憶體中存在兩份,這顯然是記憶體的一種浪費,使用動態鏈結庫就可以解決這個問題。動態鏈結庫dll與其他應用程式通過動態鏈結技術來共享 如果乙個應用程式使用了...
C呼叫C 鏈結庫
c呼叫c 鏈結庫 1.編寫c 編寫函式的時候,需要加入對c的介面,也就是extern c 2.由於c不能直接用 class.function 的形式呼叫函式,所以c 中需要為c寫乙個介面函式。例如本來要呼叫student類的talk函式,就另外寫乙個cfun 專門建乙個student類,並呼叫tal...
C 呼叫C鏈結庫
c 呼叫c鏈結庫 c 呼叫c語言的鏈結庫,其實相對c呼叫c 簡單。因為c 本來就向下相容c吧 個人見解 簡單說來原因就是未經處理的c 編譯後函式名可能變為 helloc 之類的,而c 編譯後函式名卻不是這樣,所以就對不上。詳細解釋見 需要在include c的檔案的時候加上extern c c.h ...