動態裝載、調用DLL中的非託管函數

(二)     動態裝載、調用DLL中的非託管函數函數

在上面已經說明了如何用DllImport調用DLL中的非託管函數,可是這個是全局的函數,倘若DLL中的非託管函數有一個靜態變量S,每次調用這個函數的時候,靜態變量S就自動加1。結果,當須要從新計數時,就不能得出想要的結果。下面將用例子說明:設計

1.        DLL的建立orm

1)        啓動Visual C++ 6.0;it

2)        新建一個「Win32 Dynamic-Link Library」工程,工程名稱爲「Count」;編譯

3)        在「Dll kind」選擇界面中選擇「A simple dll project」;變量

4)        打開Count.cpp,添加以下代碼:
// 導出函數,使用「 _stdcall 」 標準調用bug

extern "C" _declspec(dllexport)int _stdcall count(int init);程序

int _stdcall count(int init)方法

{//count 函數,使用參數 init 初始化靜態的整形變量 S ,並使 S 自加 1 後返回該值im

static int S=init;

S++;

return S;

}


5)        按「F7」進行編譯,獲得Count.dll(在工程目錄下的Debug文件夾中)。

 

2.         用DllImport調用DLL中的count函數

1)        打開項目「Tzb」,向「Form1」窗體中添加一個按鈕。

2)        改變按鈕的屬性:Name爲 「B2」,Text爲 「用DllImport調用DLL中count函數」,並將按鈕B1調整到適當大小,移到適當位置。

3)        打開「Form1.cs」代碼視圖,使用關鍵字 static 和 extern 聲明方法「count」,並使其具備來自 Count.dll 的導出函數count的實現,代碼以下:


[DllImport("Count.dll")]

static extern int count(int init);


4)        在「Form1.cs[設計]」視圖中雙擊按鈕B2,在「B2_Click」方法體內添加以下代碼:
MessageBox.Show(" 用 DllImport 調用 DLL 中的 count 函數, n 傳入的實參爲 0 ,獲得的結果是: "+count(0).ToString()," 挑戰杯 ");

MessageBox.Show(" 用 DllImport 調用 DLL 中的 count 函數, n 傳入的實參爲 10 ,獲得的結果是: "+count(10).ToString()+"n 結果可不是想要的 11 哦!!! "," 挑戰杯 ");

MessageBox.Show(" 所得結果代表: n 用 DllImport 調用 DLL 中的非託管 n 函數是全局的、靜態的函數!!! "," 挑戰杯 ");

 

5)        把Count.dll複製到項目「Tzb」的binDebug文件夾中,按「F5」運行該程序,並點擊按鈕B2,便彈出以下三個提示框:


  

第1個提示框顯示的是調用「count(0)」的結果,第2個提示框顯示的是調用「count(10)」的結果,由所得結果能夠證實「用DllImport調用DLL中的非託管函數是全局的、靜態的函數」。因此,有時候並不能達到咱們目的,所以咱們須要使用下面所介紹的方法:C#動態調用DLL中的函數。

相關文章
相關標籤/搜索