Re: [問題] help!關於製作dll
※ 引述《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
03/23 20:31, 1F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章