DLL专题之VC开发DLL和DLL编写说明

来源:互联网 发布:github java 开源项目 编辑:程序博客网 时间:2024/05/23 19:13

今天,我们就真正进入了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

原创粉丝点击