Chinaunix首页 | 论坛 | 博客
  • 博客访问: 326206
  • 博文数量: 90
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 694
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-22 10:51
文章分类

全部博文(90)

文章存档

2011年(3)

2010年(35)

2009年(52)

我的朋友

分类: C/C++

2009-12-04 11:17:59

1.新建一个WorkSpaceDllSample 

2Add New Project to Workspace,新建工程MyDll,工程类型选择“Win32 Dynamic-Link Library”,选择“A DLL that exports some symbols,即要求VC++自动生成一些导出符号代码。

 (1)  在头文件MyDll.h中添加导出变量、函数和类的声明。

//MyDll.h

#ifdef MYDLL_EXPORTS

#define MYDLL_API __declspec(dllexport)

#else

#define MYDLL_API __declspec(dllimport)

#endif

//如果要声明常量,直接使用#define

//声明要导出的变量

extern MYDLL_API int nDllExportVar;

//声明要导出的函数

MYDLL_API void ExportFunc(LPCTSTR pszContent);

//声明要导出的类

class MYDLL_API MyDllClass

{      

public:      

         MyDllClass();  

};

   我们观察ProjectsàSettingsàC/C++àPreprocessor definition中有一项MYDLL_EXPORTS。它是VC自动生成的宏,故在MyDll工程中,MYDLL_API解释为 __declspec(dllexport),用MYDLL_API修饰的变量、函数和类将从DLL模块中导出。

   而在后面普通的测试工程MyDllDemo中,没有预定义MYDLL_EXPORTS宏,故MYDLL_API解释为 __declspec(dllimport),表示外部DLL模块中被MYDLL_API修饰的变量、函数和类将被导入本工程为其所用

 (2) 在实现文件MyDll.cpp中定义导出变量、函数和类。

//MyDll.cpp

#include "stdafx.h"

#include "MyDll.h"

//初始化全局变量

MYDLL_API int nDllExportVar=15;

HMODULE g_hModule; //全局模块句柄

BOOL APIENTRY DllMain( HANDLE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

                                                )

{

    switch (ul_reason_for_call)

         {

         case DLL_PROCESS_ATTACH:

                   g_hModule=(HMODULE)hModule;      //保存模块句柄

//      case DLL_THREAD_ATTACH:

//      case DLL_THREAD_DETACH:

//      case DLL_PROCESS_DETACH:

                   break;

    }

    return TRUE;

}

//自定义导出函数

//要想将此函数导出供其他模块使用,须在DllDemo.h头文件中进行声明

void ExportFunc(LPCTSTR pszContent)

{      

         char sz[MAX_PATH];     

         //获得本DLL模块的文件名      

         ::GetModuleFileName(g_hModule,sz,MAX_PATH);         

         ::MessageBox(NULL,pszContent,strrchr(sz,'\\')+1,MB_OK);      

}

//自定义导出类

MyDllClass::MyDllClass()

{      

         ::MessageBox(NULL,"DLL导出类","MyDllClass",MB_OK);    

}

3)选择win32 Release编译链接程序。则在DLLSample\MyDll\Release 文件夹下生成了动态链接库MyDll.dll及其导入库MyDll.lib

Microsoft Visual C++ 6 ToolsàDependsà打开MyDll.dll,可以查看MyDll导出的变量、函数及类:

4装载期间动态链接dll的方法

VC中使用DLL需要用到相应的lib文件和头文件。静态链接库lib文件中存放的是接口函数申明的入口地址,dll中存放的是函数实体!lib告诉编译器你的dll都导出了什么函数,以及这些函数的地址名称,运行的时候就根据这些信息到dll里面去找。头文件(*.h)作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件(*.c|*.cpp)用于保存程序的实现 (implementation)。编译时需要用到头文件,链接时用到lib文件,运行exe时用到dll。以下为工程中使用动态链接库的步骤:

<1>dll文件复制到工程的debug|release目录下,使其与exe文件放在一起。

Windows将遵循下面的搜索顺序来定位 DLL:包含EXE文件的目录>进程的当前工作

目录(VC工程目录)>Windows系统目录(X :\WINDOWS\system32))>Windows目录(X :\WINDOWS>列在环境变量Path中的一系列目录

<2>添加lib链接:先Project->Settings->Link->Object/library modules,填写you.lib,表示该

工程将链接此静态库;再Tools->Options->Directories->Library Files,添加you.lib所在目录。

链接时将到此目录查找lib文件。

VC将首先到安装目录的\VC98\LIB\VC98\MFC\LIB目录(和自己添加的Library Files

目录下)下查找需要的lib文件,然后再到当前工程目录下查找。查找顺序可在Tools->OptionsDirectories-> Library Files中进行调整。

<3> 添加头文件:先在要使用该函数的地方包含该LIB的头文件,然后再

Tools->Options->Directories->Header Files,添加you.h所在目录。链接时将到此目录查找头

文件。

VC将首先到安装目录的\VC98\INCLUDE\VC98\MFC\INCLUDE\VC98\ATL\INCLUDE(和自己添加的Include Files目录下)查找编译系统提供的公共头文件。优先在工程目录下查找”MyHeader.h”,如果没有找到双引号头文件,再到以上编译系统公共头文件目录和自己添加的Include Files目录下查找。

查找顺序可在Tools->OptionsDirectories-> Header Files中进行调整。

 

3Add New Project to Workspace,新建测试工程MyDllDemo,工程类型选择“Win32 Console Application”。新建MyDllDemo.cpp然后按24)步骤MyDll.dll复制到MyDllDemo工程目录,将MyDll.h添加到Include Files,将MyDll.lib添加到Library Files下面MyDll.dll复制到MyDllDemo工程目录后,直接采用相对路径包含。

//MyDllDemo.cpp

#include

#include

#include "..\MyDll\MyDll.h"

#pragma comment(lib,"..\\MyDll\\Release\\MyDll.lib")//Projects->Settings->Link MyDll.lib

 

int main(int argc, char *argv[])

{    

         //像调用本地函数一样调用DllDemo.dll库的导出变量、函数、类  

         printf("DLL导出变量nDllExportVar=%d\n",nDllExportVar);      

         ExportFunc("DLL导出函数");  

         MyDllClass myDllClass;

         return 0;   

}

参考:

Win32环境下动态链接库(DLL)编程原理

动态链接库dll,静态链接库lib, 导入库lib

http://www.cppblog.com/jerryma/archive/2009/07/21/90711.aspx

《深入浅出Visual C++动态链接库(Dll)编程》

阅读(1108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~