作者babyghost (赚P币去赌博!!)
看板C_and_CPP
标题Re: [问题] help!关於制作dll
时间Thu Mar 23 15:49:37 2006
※ 引述《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