C_and_CPP 板


LINE

※ 引述《fej》之銘言: : (5)選build-->build 123.dll 然後在debug目錄下就有123.dll 及 123.lib : (6)然後再開一個新專案 file -->new -->project中的win32 console application : 叫user的專案 : (7)開一header file 叫"user.h",且把之前的123.dll 及 123.lib複製 貼在此專案裡 : 然後選把'123.lib' add to project : (8)以下是我的user.h內容..只有一句 : int __declspec(dllexport) __stdcall VCType_Count(int m, int n); Hi, 在建 dll 時你的 user.h 應該是 dllimport. 在使用 dll 時你的 user.h 應該要寫 dllexport. 下面是我以前寫過一些整理的 dll 的寫法, 參考看看吧, 不一定是唯一建 dll 的方法, 這只是我的經驗 XD ---------------------------------------------------------------------------- 寫 DLL 時可以分成下列二種 : 1. 純寫 C/C++(WIN32) 資料處理,沒有用到 MFC 的任何東西時, 利用下列語法來描述要輸出函式和類別 : 建 Dll 別忘了要加入前置定義 BUILDINGDLL #ifndef BUILDINGDLL #define MYDLLAPI __declspec(dllimport) #else #define MYDLLAPI __declspec(dllexport) #endif MYDLLAPI int export_g_value; MYDLLAPI int export_function_name( int args, ... ); class MYDLLAPI class_name { }; 利用這個語法,做出來的 dll 比較有彈性,在別的編譯器編譯, 就可以過關,而不限只在 VC。 在寫這種 dll,若要提供給純 C 使用時,必須要加上下列語法 : extern "C" { int function(); class Person { ... }; } 因為 C 的 dll 函式編碼各家編譯器都統一,所以做出來的 Dll 可以共用,但是 C++ 的 dll 函式編碼沒有統一,所以做出來的 Dll 就不可以共用了,因此為了共用必須使用上述 extern "C" 語法包起來。 2. Dll 裡內建資源,例如包含了一個對話盒等等,即有用到 MFC 時, 在這種情況下,若選擇 win32/Dll 專案,則對話盒會顯示不出來, 我們必須要選擇 MFC Dll,共分成三種,其中 Regular Dll 是用來 提供給非 VC 的程式讓它們也可以使用此 Dll,例如 VB 等等, 若只給 VC 程式用,則選擇 Extension DLL,此時利用下列語法來 描述要輸出的函式和類別 : 在 MFC Dll 裡,除了可以利用上述的 純 C/C++(WIN32) 寫法 來描述外, MFC dll 還提供另一種較方便的寫法,在輸出變數 、函式、類別都一樣,只要加 AFX_EXT_CLASS 即可,要注意的 是用 MFC Dll 時,前置定義會多個 _AFXEXT ,不能砍掉,這 是給 AFX_EXT_CLASS 用的,相當於上述的 BUILDINGDLL ex : extern AFX_EXT_CLASS int export_g_value; AFX_EXT_CLASS int export_function(); class AFX_EXT_CLASS CStudent : public CObject { // class interface declare.. }; 如何在 Exe 專案裡 link dll ? 有二種方式 : 1. Delayed Load : 在這種方式下,比較有彈性,即使沒有 dll 程式還是可以執行, dll 視須要時才被程式載入使用,使用方式如下 : // 載入某個 dll LoadLibrary("xxx.dll"); // 輸出某個 function GetProcAddress("function_name"); // ... 使用它 // 釋於該 dll FreeLibrary("xxx.dll"); 只要這三個函式即可使用 dll。 2. 直接 link 在程式裡 : 在這種方式下,程式一開始就要找到 xxx.dll,不然就無法執行, 使用時較 delayed load 沒彈性,但寫程式時不用 GetProcAddress 去取得要用函式的名稱,省去很多麻煩,可以直接呼叫 dll 所給 的標頭檔裡的輸出函式來用。 不管使用哪一種方式,都必須要將 dll 輸出函式的那個標頭檔加入到 執行檔的專案下,用 AddFile 加入即可,不用複製一份過來,而在專 案裡 include 時如下 : #include "..\MyDll\MyDll.h" 輸入相對位置即可,而在執行檔專案設定裡,須要在 linker-> Additional Dependencies 填入 xxxxx.lib (視該 lib 位置填入相對位置即可) linker->Advanced 填入 xxxxx.dll (視該 dll 位置填入相對位置即可) 降子就不會有 link 上的錯誤發生了。 做出來的執行檔必須要找得到 xxxxx.dll 才能正確的執行,通常將該 dll 放在和執行檔一樣的位置。 ------------------------------------------------------------------------- Good Luck! --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.246.54
1F:→ babyghost:寫錯,建時應該用dllexport, 用時應該用dllimport XD 03/23 20:31







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP