正文

动态链接库DLL的创建和使用2009-03-15 21:13:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/41483.html

分享到:

1.新建一个WorkSpace—DllSample。  2.Add 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\system(32))>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目录下)查找编译系统提供的公共头文件<std***.h>。优先在工程目录下查找”MyHeader.h”,如果没有找到双引号头文件,再到以上编译系统公共头文件目录和自己添加的Include Files目录下查找。 查找顺序可在Tools->OptionsDirectories-> Header Files中进行调整。   3.Add New Project to Workspace,新建测试工程MyDllDemo,工程类型选择“Win32 Console Application”。新建MyDllDemo.cpp,然后按2(4)步骤将MyDll.dll复制到MyDllDemo工程目录,将MyDll.h添加到Include Files,将MyDll.lib添加到Library Files。下面将MyDll.dll复制到MyDllDemo工程目录后,直接采用相对路径包含。 //MyDllDemo.cpp #include <stdio.h> #include <windows.h> #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)编程原理》 http://www.yesky.com/474/1871974.shtml 《动态链接库dll,静态链接库lib, 导入库lib》 http://www.cppblog.com/jerryma/archive/2009/07/21/90711.aspx 《深入浅出Visual C++动态链接库(Dll)编程》 http://soft.yesky.com/lesson/318/2166818.shtml

阅读(4076) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册