VC2008如何生成及使用DLL

 生成、使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的。

1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目:

VC2008如何生成及使用DLL_第1张图片

 

2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。

3. 工程生成后需要修改属性,在配置属性的常规选项中将MFC的使用修改为“静态库中使用MFC”。

    注意,这一步是必须的,否则写出来的DLL将需要在有VC2008的环境上才能运行。

4. 关注自动生成的文件MyDllTest.cpp,其中有几个实例,可以将他们删除,也可以不管他们。

5. 添加自己的接口,如:GetMyDllVersion

// 得到当前DLL的版本号 MYDLLTEST_API UINT32 GetMyDllVerion(VOID) { return 1234; }

6. 在头文件MyDllTest.h中添加声明

MYDLLTEST_API UINT32 GetMyDllVerion(VOID);

7. 添加导出符号定义文件,理论上是可以不要导出定义的,但是那样的结果就是生成的DLL中的符号名字不明确,只有定义了导出符号,才可以使得DLL中的借口函数名称得以确定。

LIBRARY "MyDllTest" EXPORTS GetMyDllVerion

8. 在项目属性中设置模块定义文件为刚才建立的symexport.def文件:

9. 生成,可以得到一个MyDllTest.dll,使用Depends工具(VC6.0自带)可以查看这个DLL中包含了多少接口以及接口名:

 VC2008如何生成及使用DLL_第2张图片

会发现除了我们定义的借口GetMyDllVersion外还有几个??开头的接口,他们就是那些没有在模块定义文件中定义的借口自动生成的。

10. 除了DLL外我们还会发现生成了MyDllTest.lib文件,这个lib文件可以在其他的程序使用这个DLL的时候将其连接进去,同时只要包含MyDllTest.h即可调用这个DLL中的借口了。

11. 有时候我们拿到的是别人的DLL和头文件,但是却没有LIB文件,这时就要使用另外的方法调用DLL中的接口了,例如MD5接口的使用:

// 按照MSDN中的说明定义函数原型如下 typedef struct { ULONG i[2]; ULONG buf[4]; unsigned char in[64]; unsigned char digest[16]; } MD5_CTX; typedef void (CALLBACK* MD5Init_Tpye)(MD5_CTX* context); typedef void (CALLBACK* MD5Update_Tpye)(MD5_CTX* context, unsigned char* input, unsigned int inlen); typedef void (CALLBACK* MD5Final_Tpye)(MD5_CTX* context);

 

 // 使用MD5接口 HINSTANCE hDLL; // MD5接口是在Cryptdll.dll中的 hDLL = LoadLibrary(TEXT("Cryptdll.dll")); MD5Init_Tpye MD5Init; MD5Update_Tpye MD5Update; MD5Final_Tpye MD5Final; // 得到接口指针 MD5Init = (MD5Init_Tpye)GetProcAddress(hDLL, "MD5Init"); MD5Update = (MD5Update_Tpye)GetProcAddress(hDLL, "MD5Update"); MD5Final = (MD5Final_Tpye)GetProcAddress(hDLL, "MD5Final"); if (!MD5Init || !MD5Update || !MD5Final) { // 取得接口指针失败 FreeLibrary(hDLL); return; } MD5_CTX md5_context; MD5Init(&md5_context); MD5Update(&md5_context, src, length); MD5Final(&md5_context); // 不要忘记释放导入的DLL FreeLibrary(hDLL);

 

这就是目前我知道的两种使用DLL的方法了,至于还有没有其他的方法,暂时没有这方面的需求,也就不去花脑力想了。。。

你可能感兴趣的:(api,struct,mfc,dll,callback,library)