今天,我们就真正进入了DLL编程,当然了,今天是写第一个DLL,就写个简单的啦!呵呵
首先建立一个DLL工程(Win32 DynamicLink(Dll))工程,选择一个空的工程,然后添加一个头文件和一个实现文件,分别是:Simple.h和Simple.cpp.具体代码和说明如下:
Simple.h文件内容:
#ifndef _SIMPLE_DLL_H_
#define _SIMPLE_DLL_H_
#include "windows.h"
/*------------------------------------------------------------*/
_declspec(dllexport) : 表示这个函数是DLL导出函数,可以被外部引
用。
extern "C" 表面是使用C调用约定,并且不会发生函数名字改变
如果想让VC++编写的DLL被其他语言编写的程序调用,那么应该将函数的
调用约定声明为__stdcall。
C/C++调用方式为__cdecl,若采用C调用方式,将函数声明为extern "C"。
__stdcall方式与__cdecl对函数名最终生成符号是不同的,而且参数的
入栈顺序也不同。
由于不同的调用方式下,可能最终导出的函数名称会有不同的变化(即发
生了名字改编),为了防止名字改编,我们还有另一种方式来导出函数方
式(推荐使用) :
用名字定义文件的方式,即增加一个.def文件。
.def文件格式如下:
; Simple.def : 导出DLL函数
LIBRARY Simple
EXPORTS
ShowMessage @ 1
1、注释由“;” 指定,注释不能与语句在同一行。
2、“LIBRARY”语句说明.def文件相应的DLL;
3、“EXPORTS”说明要导出函数的名称。“@ 1”,表示要导出函数的序
号为1(在函数调用时,可以用到这个序号)
因此,Simple.def文件的解释是:生成Simple.DLL的动态链接库,其导出
ShowMessage函数,该函数的序号为1。
/*------------------------------------------------------------*/
extern "C" _declspec(dllexport) void ShowMessage( LPCTSTR pstrMsg, LPCTSTR pstrTitle );
#endif//_SIMPLE_DLL_H_
Simple.cpp文件内容:
#include "Simple.h"
void ShowMessage( LPCTSTR pstrMsg, LPCTSTR pstrTitle )
{
MessageBox( NULL, pstrMsg, pstrTitle, MB_OK |MB_ICONINFORMATION );
}
然后,我们就要试着来调用我们的DLL啊,那接着看下面的代码吧:
/*-------------------------------------------------------------------------------------*/
使用VC编写DLL
非MFC动态库, 即非MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所
调用。
MFC规则动态库, 有一个继承自CWinApp的类,不过没有消息循环。
MFC扩展动态库, 使用MFC的动态链接版本创建,只能被用MFC类库所编写的应用程序调用。
VC环境下有两种方式查看你的DLL:
一个是Depends工具,一个是控制台的dumpbin工具。
VC环境下调试: 如果你想调进DLL,你必须在调用DLL函数的时候设个断点,当程序调试到断点时,你按
F11键就可以进入DLL了
/*-------------------------------------------------------------------------------------*/
//动态库的使用
void CDllDlg::OnBtnSimple()
{
// TODO: Add your control notification handler code here
/*-----------------------------------------------------------------*/
动态连接库一般使用方法:LoadLibrary - GetProcAddress - FreeLibrary
/*-----------------------------------------------------------------*/
typedef void (*lpShowMessage)
( LPCTSTR pstrMsg, LPCTSTR pstrTitle ); //DLL里的函数原型
HINSTANCE hInst = NULL; //DLL的实例句柄
lpShowMessage ShowMessage; //函数定义
hInst = LoadLibrary( ".//Simple//Debug//Simple.dll" ); //导入DLL
if ( !hInst ) return ;
ShowMessage = (lpShowMessage)GetProcAddress( hInst, "ShowMessage" ); //得到DLL里的函数地址
if ( ShowMessage )
{
ShowMessage( _T("Hello World!"), _T("Information") ); //调用DLL里的函数
}
FreeLibrary( hInst ); //释放DLL
}
好了,就到这了.COPY的是不是很爽啊.要顶一顶了嘛!不说了,BYE