您的位置:首页 > 编程语言 > C语言/C++

【原创】C++创建和使用动态链接库之常规DLL

2009-11-27 17:41 597 查看
MFC常规DLL中可以使用C++和MFC类库及函数,但其导出接口必须是C函数,不能导出C++函数和类

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中加入函数的声明

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; }



运行效果如图所示






源程序下载地址



 


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: