【原创】C++创建和使用动态链接库之常规DLL
2009-11-27 17:41
597 查看
MFC常规DLL中可以使用C++和MFC类库及函数,但其导出接口必须是C函数,不能导出C++函数和类
MFC常规DLL可以在MFC程序和大多数Win32程序中使用
创建常规DLL
使用常规DLL(显示链接)
因为常规DLL导出的是标准C函数,可以被非MFC程序使用,所以这里创建了一个Win32控制台程序
新建一个Win32 Console Application工程,工程名为test
把前面生成的ShowTime.dll拷贝到工程目录中,在debug目录再拷贝一份防止直接运行exe时找不到DLL
添加一个cpp文件,输入如下代码
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
MFC常规DLL可以在MFC程序和大多数Win32程序中使用
创建常规DLL
新建工程 选择MFC APPWizard(dll),工程名为ShowTime,点击确定
进入下一个步骤要创建的DLL的类型,如图所示:
动态链接库和MFC静态链接:这种DLL在链接过程中会将使用到得MFC类库复制一份到最终的DLL文件中
最终生成的DLL比较庞大且加载时不是很方便,但它可以在没有MFC类库DLL文件的机器上使用
动态链接库使用共享MFC DLL:这种DLL不会将用到的MFC类库复制到最终生成的DLL中,因此最终的DLL比较小,加载也很方便,但在没有MFC类库DLL文件的机器上无法使用,必须有MFC类库的支持
MFC扩展DLL(使用共享MFC DLL):MFC扩展DLL可以导出C++类以及MFC派生类,使用这种DLL必须有MFC类库的支持
选择动态链接库使用共享MFC DLL选项,单机完成。程序会自动生成对应的文件
其中ShowTime.h和ShowTime.cpp以及ShowTime.def是我们要用到的
在ShowTime.h中加入函数的声明
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
在ShowTime.cpp中加入函数的实现
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
使用显示链接调用DLL时,用GetProcAddress函数指定的函数名必须是编译后经过编译器重命名的函数名,而不是源文件中定义的函数名。而程序员不大可能去了解每一个经过重命名的导出函数名,所幸微软给出了一个很好的解决方法,那就是在编写动态库的同时编写一个def为后缀的编译命名参考文件,如果动态库中有该文件,则编译器会根据该文件指定的函数名来导出动态库中的函数
每个def文件至少必须包含以下模块
LIBRARY "DLL名称" //默认生成的def文件会自动添加对应的DLL名字
EXPORTS语句列出被导出的函数的名字,被导出的函数可以和一个数字序号相对应
本例只需在EXPORTS语句下面添加一个函数ShowTime @1
在ShowTime.def中添加要导出的函数名
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
编译并链接,在工程的debug目录里会生成ShowTime.dll和ShowTime.lib文件
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
进入下一个步骤要创建的DLL的类型,如图所示:
动态链接库和MFC静态链接:这种DLL在链接过程中会将使用到得MFC类库复制一份到最终的DLL文件中
最终生成的DLL比较庞大且加载时不是很方便,但它可以在没有MFC类库DLL文件的机器上使用
动态链接库使用共享MFC DLL:这种DLL不会将用到的MFC类库复制到最终生成的DLL中,因此最终的DLL比较小,加载也很方便,但在没有MFC类库DLL文件的机器上无法使用,必须有MFC类库的支持
MFC扩展DLL(使用共享MFC DLL):MFC扩展DLL可以导出C++类以及MFC派生类,使用这种DLL必须有MFC类库的支持
选择动态链接库使用共享MFC DLL选项,单机完成。程序会自动生成对应的文件
其中ShowTime.h和ShowTime.cpp以及ShowTime.def是我们要用到的
在ShowTime.h中加入函数的声明
void ShowTime();
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
在ShowTime.cpp中加入函数的实现
void ShowTime()
[code]{
CString strtime;
SYSTEMTIME systime;
GetLocalTime(&systime);
strtime.Format("现在时间是: %d 年 %d 月 %d 日 %d 时 %d 分 %d 秒",
systime.wYear,systime.wMonth,systime.wDay,
systime.wHour,systime.wMinute,systime.wMilliseconds);
MessageBox(NULL,strtime,"Time",NULL);
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
使用显示链接调用DLL时,用GetProcAddress函数指定的函数名必须是编译后经过编译器重命名的函数名,而不是源文件中定义的函数名。而程序员不大可能去了解每一个经过重命名的导出函数名,所幸微软给出了一个很好的解决方法,那就是在编写动态库的同时编写一个def为后缀的编译命名参考文件,如果动态库中有该文件,则编译器会根据该文件指定的函数名来导出动态库中的函数
每个def文件至少必须包含以下模块
LIBRARY "DLL名称" //默认生成的def文件会自动添加对应的DLL名字
EXPORTS语句列出被导出的函数的名字,被导出的函数可以和一个数字序号相对应
本例只需在EXPORTS语句下面添加一个函数ShowTime @1
在ShowTime.def中添加要导出的函数名
EXPORTS
[code] ; Explicit exports can go here
ShowTime @1 //@1表示ShowTime函数对应的数字序号为1
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
编译并链接,在工程的debug目录里会生成ShowTime.dll和ShowTime.lib文件
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
使用常规DLL(显示链接)
因为常规DLL导出的是标准C函数,可以被非MFC程序使用,所以这里创建了一个Win32控制台程序
新建一个Win32 Console Application工程,工程名为test
把前面生成的ShowTime.dll拷贝到工程目录中,在debug目录再拷贝一份防止直接运行exe时找不到DLL
添加一个cpp文件,输入如下代码
#include <windows.h>
[code]
int main()
{
HINSTANCE hInstance; //HINSTANCE需要包含windows.h
typedef char* (Fun)(); //定义函数原型
Fun* pFun; //声明函数指针
//返回由LoadLibrary加载的动态链接库的实例句柄
hInstance=LoadLibrary("ShowTime");
//找到DLL中ShowTime函数的地址,函数名调用
//pFun=(Fun*)GetProcAddress(hInstance,"ShowTime");
//使用数字序号方式,可明显加快函数的调用
pFun=(Fun*)GetProcAddress(hInstance,(LPCSTR) 1);
(*pFun)(); //调用函数
FreeLibrary(hInstance); //释放调用的DLL资源
return 0;
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
相关文章推荐
- 【原创】C++创建和使用动态链接库之Win32DLL
- vs2010 C++创建和使用动态链接库(dll)
- c++ 创建和使用动态链接库 DLL
- C++创建动态链接库(*.dll)
- C/C++编写dll动态链接库使用操作与非基本类型参数声明错误(2)
- vs2010 创建和C#使用动态链接库(dll)
- vs2010创建和使用动态链接库(dll)
- vs2010创建和使用动态链接库(dll)
- [原创]W2k Driving 学习笔记(二)使用GCC创建 Windows NT 下的内核DLL
- 动态库学习 第1章——演练:创建和使用动态链接库 (C++)
- 创建和使用动态链接库(dll)
- [原创]使用GCC创建 Windows NT 下的内核DLL
- 动态链接库(DLL)总结---动态链接库的创建与使用(5)
- vs2010创建和使用动态链接库(dll)
- vs2010创建和使用动态链接库(dll)
- electron 使用 node-ffi 调用 C++ 动态链接库(DLL)
- 创建和使用动态链接库 (C++)
- C# DumpBin使用 查看反射C++ dll 动态链接库中的函数
- vs2010创建和使用动态链接库(dll)
- VS2012下创建和使用DLL (C++)