生成、使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的。
1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目:
2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。
3. 工程生成后需要修改属性,在配置属性的常规选项中将MFC的使用修改为“静态库中使用MFC”。
注意,这一步是必须的,否则写出来的DLL将需要在有VC2008的环境上才能运行。
4. 关注自动生成的文件MyDllTest.cpp,其中有几个实例,可以将他们删除,也可以不管他们。
5. 添加自己的接口,如:GetMyDllVersion
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
MYDLLTEST_API UINT32
GetMyDllVerion(
VOID
)
-
{
-
return
1234;
-
}
6. 在头文件MyDllTest.h中添加声明
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
MYDLLTEST_API
UINT32
GetMyDllVerion(
VOID
);
7. 添加导出符号定义文件,理论上是可以不要导出定义的,但是那样的结果就是生成的DLL中的符号名字不明确,只有定义了导出符号,才可以使得DLL中的借口函数名称得以确定。(关于def与dll 请参阅msdn
)
文件内容:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
LIBRARY
"MyDllTest"
-
EXPORTS
-
GetMyDllVerion
8. 在项目属性中设置模块定义文件为刚才建立的symexport.def文件:
9. 生成,可以得到一个MyDllTest.dll,使用Depends工具(VC6.0自带)可以查看这个DLL中包含了多少接口以及接口名:
会发现除了我们定义的借口GetMyDllVersion外还有几个??开头的接口,他们就是那些没有在模块定义文件中定义的借口自动生成的。
10. 除了DLL外我们还会发现生成了MyDllTest.lib文件,这个lib文件可以在其他的程序使用这个DLL的时候将其连接进去,同时只要包含MyDllTest.h即可调用这个DLL中的借口了。
如何引入dll
方法一.装载期间动态加载。(需要lib和dll)
1。新建Win32应用程序空项目。
2。把生成的dll、lib这2个文件复制到新建的目录下。
3。添加导入库:工具--项目和解决方案(vs里是options)--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。
4。头文件:
MyDllTest.h(与编写DLL中一样)
5。源文件:main.c
可注释#pragma comment(lib,"
MyDllTest.lib")这条,但必须设置链接库,方法:
右击项目--属性--配置属性--链接器--输入--附加依赖项:
MyDllTest.lib
-
-
#include "
MyDllTest.h"
-
#include "
windows.h"
-
#pragma comment(lib,"
MyDllTest.lib")
-
-
int
WINAPI WinMain(__in
HINSTANCE
hInstance, __in_opt
HINSTANCE
hPrevInstance, __in_opt
LPSTR
lpCmdLine, __in
int
nShowCmd )
-
{
-
-
-
GetMyDllVersion();
-
return
0;
-
}
方法二:运行期间动态加载。(只需Dll文件即可)
需要使用
Windows API
函数:
LoadLibrary
、
GetProcAddress
以及
FreeLibrary
#include <iostream>
#include <windows.h>
using namespace std;
//定义FunctionFunc为指向一个返回值为int型 无参数的函数的指针
typedef int (*FunctionFunc)();
int main()
{
FunctionFunc _FunctionFunc;
//加载目标Dll
HMODULE hModule = ::LoadLibrary
(TEXT("D:\MyDllTest.dll"));
if (hModule==NULL)//如果Dll加载失败,释放它占用的资源
{
::FreeLibrary(hModule);
}
//取得目标Dll中导出函数的地址(提醒:函数名就是函数的入口地址)
_FunctionFunc=(FunctionFunc)::GetProcAddress
(hModule,"GetMyDllVersion");
if (_FunctionFunc==NULL)
{
::FreeLibrary
(hModule);
}
int a =_FunctionFunc();
cout<< a<<endl;
::FreeLibrary(hModule);
cin.get();
return 1;
}
有时候我们拿到的是别人的DLL和头文件,但是却没有LIB文件,这时就要使用另外的方法调用DLL中的接口了,例如MD5接口的使用:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
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);
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
-
-
HINSTANCE
hDLL;
-
-
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);
-
-
-
FreeLibrary(hDLL);
这就是目前我知道的两种使用DLL的方法了,至于还有没有其他的方法,暂时没有这方面的需求,也就不去花脑力想了。。。
- 大小: 33.1 KB
- 大小: 95.1 KB
- 大小: 56.8 KB
- 大小: 72 KB
- 大小: 99.7 KB
- 大小: 78.8 KB
分享到:
相关推荐
。。。
使用VC6.0完整绿色免安装版 可以正常编译但是运行出错,提示缺少动态链接库,此处将需要的dll库文件打包以方便兄弟们使用~ 包括: MFC42.DLL mfc42d.dll MFCN42D.DLL mfco42d.dll msvcrtd.dll 使用说明:可以将...
本组件对于个人使用完全免费,请在使用过程中遵守三方协议,如需应用商业,请联系作者! 本组件有完整的Delphi,VC和BCB调用例子,VB,.net,java也可以调用,这里就不给出例子了O(∩_∩)O 任何建议欢迎反馈 2009年...
一步一步教你用VC和VB调用C++ DLL,网上流传的大多是第一部分,‘从VC++应用程序调用C++ DLL的函数‘和’从VC++应用程序调用C++ DLL的类’,这个是完整的,包括 从VB应用程序调用C++ DLL的函数 从VB应用程序调用...
一步一步教你用VC和VB调用C++ DLL,网上流传的大多是第一部分,‘从VC++应用程序调用C++ DLL的函数‘和’从VC++应用程序调用C++ DLL的类’,这个是完整的,包括 从VB应用程序调用C++ DLL的函数 从VB应用程序调用...
内含:IA64,x86,x64,Release,Debug, 各个版本都在,完整无误 ATL,CRT,MFC,MFCLOC,OPENMP
teighafileconverter_qt5_vc10dll包,可使用它进行CAD文件格式转换,支持CAD版本ASCII和二进制两种,版本支持R9、R10、R12、R13、R14、2000、2004、2007、 2010、2013、2018等版本的dwg与dxf直接互相转换,转换后的...
。。。
将.dll及reg档copy至VC6.0所安装的文件内的MSDev98\AddIns。 2.reg档进行merge(有些VC6.0不许merge,直接放在此文件夹内即可) 3.开启VC至Tools -> customize -> Add-ins and Macro Files勾选VC6LineNumber ...
mfc对话框程序中嵌入chrome浏览器,包含完整h、lib、dll。开始下载的最新版开发包CEF 3.3578.1864.gfa073f3,发现程序运行10几秒后,总是会弹出新窗口。后改用稳定版开发包cef3.2623.1401.gb90a3be,该问题得到解决...
在用C#调用VC开发的动态链接库的时候提示无法加载DLL文件时,安装这个VC库就可解决
TradeX.dll四合一股票交易接口,包括股票下单接口和行情接口 版本描述: 1)完美兼容老版的交易接口Trade.dll所有功能、函数,支持批量下单,直连交易服务器,无中转; 2)支持Level 1 + Level 2 实时行情 +扩展...
完整的 vc+ 开发的视频会议系统 要用到的dll已经打包下载提供 里面包含使用介绍 以及源代码的介绍 开发结构 所有代码测试可以运行 包含功能完整 扩展性良好
解决游戏用户打开软件出现msvcp120.dll问题
本绿色版是基于原版VC6制作,并无任何精简,集成SP6,保留了原版的所有组件。 [+]表示增加的内容 [-]表示去除的内容 [*]表示所做的改动 1.改动说明: [+]增加VAX,WndTabs,VC6LineNumberAddin.dll(显示行号插件),...
之前写的使用libcurl.lib下载的网页源码使用的lib文件。 主要包括 libcur libeay32.lib ssleay32.lib nghttp2.lib libssh2.lib ...libcurl-vc12-x86-release-dll-ssl-dll-zlib-dll-ipv6-sspi 有需要的就取吧。
9. 不是VAX,VC6中只支持16中颜色,有一个插件可以修改为24位真彩色,完全可以自己定义。 网址:http://www.codeproject.com/macro/devtruecolour.asp 10.BCGControlBar Library 功能:非常好的一套应用于vc6的...
编写密码安全方面程序必备的一个算法模板库miracl 这个是很完整的版本,解压后编译,可直接使用生成的dll文件。
FileMoniter完整VC源码 基于文件过滤驱动写的,这份是完整版的。注意其中一个编译好的DLL可能会被杀毒软件报毒,不放心的话可以删除
本绿色版是基于原版VC6制作,并无任何精简,集成SP6,保留了原版的所有组件。 [+]表示增加的内容 [-]表示去除的内容 [*]表示所做的改动 1.改动说明: [+]增加VAX,WndTabs,VC6LineNumberAddin.dll(显示行号插件),...