`

Dll入门小结(转)

阅读更多

原文:DLL入门小结

 

 

昨天花了半天时间研究了DLL技术,感到小有收获,今天整理出来,加强记忆。

DLL(Dynamic Link Library),动态链接库。

1.关于__declspec(dllimport)和__declspec(dllexport)

在一个DLL的编写过程中,如果要使一个变量、一个函数或一个类能够被外部程序调用,在函数声明上加上__declspec(dllimport)关键字。

例:

引出一个变量:
__declspec(dllexport) int iEx;

引出一个函数:
__declspec(dllexport) int fnEx( int i );

引出一个类:
class __declspec(dllexport) CClassEx
{……};

在外部程序引用DLL时,如果采用隐式调用的方法(关于隐式调用稍后讨论),需要 包含DLL文件相关的头文件,这个头文件用__declspec(dllimport)关键字指出了DLL导出的内容(实际上就是把原来的 __declspec(dllexport)全部替换为__declspec(dllimport))。

例:

引入一个变量:
__declspec(dllimport) int iEx;

引入一个函数:
__declspec(dllimport) int fnEx( int i );

引入一个类:
class __declspec(dllimport) CClassEx
{……};

为了提高程序可读性,可以定义如下宏:
#define DllImport __declspec(dllimport)
#define DllExport __declspec(dllexport)
以便使用。

实际上一般定义如下宏:
#ifdef MYDLL_EXPORTS

#define MYDLL_API __declspec ( dllexport )

#else

#define MYDLL_API __declspec ( dllimport )

#endif

这样,在源程序的实现文件中先定义 MYDLL_EXPORTS ,再包含这个头文件;在外程序内,可以直接包含这个头文件。这种方法可以实现一个文件多种用途。

  2 .隐式调用和显式调用

隐式调用是最常用的一种调用方法。它需要原 DLL 文件、原头文件和库文件组成。在程序内要包含这个头文件,并加入库文件一同编译。在程序启动时会把所有隐式调用的 DLL 文件加载到内存。

如果想在使用的时候才把 DLL 文件加入到内存的话,可以使用显式调用。显式调用只需要原 DLL 文件即可,但是使用时必须对知道这个 DLL 有哪些导出的符号。可以在 VS 的命令行方式下输入“ depends ”命令来查看 DLL 信息。

  示例:

  隐式调用:

#include "..\DllTest\DllTest.h"

……

void CallDll( void )

{

     wchar_t wszBuf[ 32 ];

     wsprintf( wszBuf, TEXT( "%d" ), fnDllTest( 9 ) ); //fnDllTest DLL 文件导出的方法

     wprintf( wszBuf );

}  

显式调用:

void CallDll( void )

{

     typedef int (*ADDPROC)( int i );

     ADDPROC Fn;

 

     HINSTANCE hInst = LoadLibrary( L "DllTest.dll" );

     if ( NULL == hInst )

     {

         wprintf( L "Failed on load DLL." );

         return ;

     }

     Fn = ( ADDPROC )GetProcAddress( hInst, "fnDllTest" );

     // 如果导出时使用的是_stdcall, 那么这里我们也应该使用(_stdcall ADDPROC)

     if ( !Fn )

          wprintf( L "Failed on get Process Address." );

     else

     {

         int i;

         i = Fn( 9 );

         wchar_t wszBuf[ 32 ];

         wsprintf( wszBuf, L "%d" , i );

         wprintf( wszBuf );

     }

     FreeLibrary(hInst); // 释放DLL

     /*

       * ADDRPROC Add = (ADDPROC)GetProcAddress(hInst, "add");

       * 第而个参数也可以使用序号:

       * MAKEINTRESOURCE(1) 代替函数名.

       */

}

3 .注意事项

如果使用 C++ 编程,那么在程序编译的时候会为变量名等符号重命为诸如“ ?fnDllTest@QAEAAV 0 形式调用便。针对问题可以导出符号 extern “C” ”修饰符,就可以保持原有名称。但是导出的类名仍然是重命名后的名称,要再研究研究。

最新发现(05-Nov-2007):用extern "C" struct __declspec(dllexport) classname即可按C格式导出类名。  

如果你使用MFC生成MFC DLL那么只要做如下定义就可以了class AFX_EXT_CLASS yourClass。

分享到:
评论

相关推荐

    C++多线程编程入门小结.pdf

    根据给定文件信息,以下是对"C++多线程编程入门小结.pdf"文件内容的知识点说明: ### 知识点一:C++多线程编程基础 C++多线程编程是指在C++程序中同时执行多个线程,以利用现代处理器的多核能力,提高程序的执行...

    COM与COM+从入门到精通(pdf版本,含源码)

    第一部分 了解COM 第1章 COM概述 何谓CoM COM术语 COM利与弊 COM的好处 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...COM+组件作为COMDLL ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 C++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 40 ...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...

    Visual C++ 2005入门经典.part06.rar (整理并添加所有书签)

    1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...

    visualC++2010入门经典源代码

    1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 c++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 ...

    Visual C++ 2005入门经典--源代码及课后练习答案

    1.7 小结 29 第2章 数据、变量和计算 31 2.1 C++程序结构 31 2.1.1 程序注释 36 2.1.2 #include指令——头文件 37 2.1.3 命名空间和using声明 37 2.1.4 main()函数 38 2.1.5 程序语句 38 2.1.6 ...

    vc ADO编程入门

    #### 五、小结 通过本文的介绍,我们可以看到,在VC++中使用ADO进行数据库编程是一项既强大又简便的技术。掌握了Connection、Command和Recordset这三个核心对象的操作,便能够有效地实现数据的检索、更新等操作。...

    易语言2024最新0基础入门+全流程实战教程,学点网赚必备技术-网盘下载.txt

    6.小结:基础总结、开发技巧 7.实战设计:Openai文本转语音工具 8.实战:界面-设计与美化 9·实战:界面-配置保存读取与交互完善 10.实战:功能开发准备-HTTP协议基础 11.实战:功能-合成、播放、导出音频 12....

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 c++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 40 2.2.1 ...

    vc++ 开发实例源码包

    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...

    McGraw C++程序调试实用手册

    内容简介 · · · · · ·  本书作为有关 Visual C++ Debugger的专著,是一本非常难得的好书。书中深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行...17.3 小结

    Visual.Basic.6大学教程.pdf

    小结 12 自测练习 14 自测练习答案 15 练习 15 第2章 集成开发环境 17 2.1 简介 17 2.2 集成开发环境综述 17 2.3 Project窗口 19 2.4 工具箱 20 2.5 Form Layout窗口 21 2.6 Properties窗口 21 2.7 菜单栏和工具栏 ...

Global site tag (gtag.js) - Google Analytics