Re: [問題] help!關於製作dll

看板C_and_CPP (C/C++)作者 (賺P幣去賭博!!)時間18年前 (2006/03/23 15:46), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
※ 引述《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

03/23 20:31, , 1F
寫錯,建時應該用dllexport, 用時應該用dllimport XD
03/23 20:31, 1F
文章代碼(AID): #148b9JkA (C_and_CPP)
文章代碼(AID): #148b9JkA (C_and_CPP)