DLL专题之VC开发DLL和DLL编写说明
2008-02-25 18:08
537 查看
今天,我们就真正进入了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
首先建立一个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
相关文章推荐
- VS2010开发——vc++项目编写DLL提供vb.net调用
- VC编写其它开发工具调用的DLL
- VC中“其原因可能是堆被损坏,这也说明*.exe中或它所加载的任何DLL中有bug”的分析
- 专题5-内核模块开发2内核模块设计与编写
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
- VC编写DLL入门实例
- 再谈在VB中调用VC++开发的DLL
- 利用VC和ADO接口编写一个dll模块实现对数据库数据的处理
- 在C#.net中调用VC 6.0编写的DLL文件
- 可供VC调用的QT编写的界面DLL方法
- QT隐式调用VC开发的DLL
- 用VC开发串口通信dll控件
- 在VB应用程序中调用VC环境下开发的DLL
- 游戏开发笔记之二——最简单的DirectX,vc窗口的编写
- VC编写DLL
- DLL在跨平台之间的使用中遇到的问题(以delphi中开发的dll,在vc中使用为例)
- 编写php扩展(二)构建扩展中的函数的说明之PHP扩展开发及内核应用之阅读笔记(一)
- 用VC开发API形式的DLL给VB调用的范例
- Win7下安装Visual Studio2015编写VC++,遇到无法找到ucrtbased.dll的问题
- 【VC MFC开发】Dll 中对话框的控件无法接受到按键消息的解决办法