1. 程式人生 > >DLL中匯出全域性變數的方法及匯入時需要注意的問題

DLL中匯出全域性變數的方法及匯入時需要注意的問題

      今天做程式需要匯出DLL中的一個全域性指標,可是匯出後只要一使用就會發生access violation,後來在網上找了找文章,原來是之前匯入方法存在問題,下面把整個DLL匯出匯入全域性函式的方法整理一下,作為記錄。整個文章大部分參考http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/699672_7.html,這篇文章寫的很不錯,有興趣的可以看看。

       全域性變數的匯出 方法:

全域性變數在DLL中的定義和使用方法與一般的程式設計是一樣的。若要匯出某全域性變數,需要在.def檔案的EXPORTS後新增:

變數名 CONSTANT

   //過時的方法


  或

變數名 DATA      //VC++提示的新方法

       全域性變數的匯入使用 方法:

extern int dllGlobalVar;

printf("%d ", *(int*)dllGlobalVar);
*(int*)dllGlobalVar = 1;

       特別要注意的是用extern int dllGlobalVar宣告所 匯入的並不是DLL中全域性變數本身,而是其地址 ,應用程式必須通過強制指標轉換來使用DLL中的全域性變數。這一點,從* (int*)dllGlobalVar可以看出。因此在採用這種方式引用DLL全域性變數時,千萬不要進行這樣的賦值操作:

dllGlobalVar = 1; 其結果是dllGlobalVar指標的內容發生變化,程式中以後再也引用不到DLL中的全域性變量了。

  在應用工程中引用DLL中全域性變數的一個更好方法 是:

extern int _declspec(dllimport) dllGlobalVar ; //用_declspec(dllimport)匯入

通過_declspec(dllimport)方式匯入的就是DLL中全域性變數本身而不再是其地址了,建議在一切可能的情況下都使用這種方式。這時如下的賦值操作就可以直接使用:

dllGlobalVar = 1; //這裡就可以直接使用, 無須進行強制指標轉換