WinAPI中所有的函数都包含在3个最重要的DLL中。Kernel32.dll:它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;User32.dll:它包含那些用于执行用户界面任务的函数,例如CreateWindow函数;GDI32.dll:它包含那些用于画图和显示文本的函数。用法新建一个Win32ConsoleApplication工程:以MathLib为工程名称新建Win32Dynamic-LinkLibrary的空工程,添加C++SourceFile源文件到工程中,命名为MathLib.c添加以下代码:1#defineMATH_API_declspec(dllexport)2#includeMathLib.h3intadd(inta,intb)4{5returna+b;6}7intsubtract(inta,intb)8{9returna-b;10}添加C/C++HeaderFile头文件到工程中,命名为MathLib.h1#ifdefMATH_API2#else3#defineMATH_API_declspec(dllimport)4#endif5MATH_APIintadd(inta,intb);6MATH_APIintsubtract(inta,intb);编译后生成MathLib.dll和MathLib.lib两个动态链接库文件。测试隐式调用新建MFCAppWizard[exe]可执行工程DllTest,用于测试刚才新建动态链接库MathLib的功能。复制MathLib.dll,MathLib.lib,MathLib.h到当前工程,在DllTestDlg.cpp中添加头文件引用:#includeMathLib.h添加MathLib.h头文件至工程,在Project-Setting-Link-object/librarymodules:添加MathLib.lib添加一个按钮Add到Dialogue中,在Add按钮的响应函数中添加以下代码:1voidCDllTestDlg::OnBtnMath()2{3//TODO:Addyourcontrolnotificationhandlercodehere4CStringres;5res.Format(10+2=%d,add(10,2));6MessageBox(res);7}编译运行程序,成功运行MathLib中的加法功能。22222222222222222222222222222222222222222222222222222222222222一。显示链接dll编写dllFILE-VisalC++项目:Win32项目-应用程序设置:选择DLL(D)选项并勾选导出符号,将h,cpp文件修改如下:MyDll.h//Mydll.h#ifdefMYDLL_EXPORTS#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endifexternCMYDLL_APIintfun(intmode);//自己写的externC不可少externCMYDLL_APIintfun2(inta,intb);MyDll.cpp#includestdafx.h#includeMyDll.hBOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){switch(ul_reason_for_call){caseDLL_PROCESS_ATTACH:caseDLL_THREAD_ATTACH:caseDLL_THREAD_DETACH:caseDLL_PROCESS_DETACH:break;}returnTRUE;}MYDLL_APIintfun(intmode)//自己写的{returnmode*mode;}MYDLL_APIintfun2(inta,intb)//自己写的{intd=(ab?(a-b):(b-a));returnd;}编写测试程序:testDll采用win32控制台生成的执行程序进行测试(注:属性-C/C++:预处理器-预处理器定义加宏:MYDLL_EXPORTS)因为MyDll.h中定义了宏#defineMYDLL_API__declspec(dllexport)#includeiostream#includeWindows.htypedefint(*PFNMYDLL)(int);//声明函数原型typedefint(*HHH)(int,int);usingnamespacestd;voidmain(){HMODULEhModule=::LoadLibrary(MyDll.dll);//加载DLL库PFNMYDLLnewfun=(PFNMYDLL)::GetProcAddress(hModule,fun);//取得fun函数的地址inti=newfun(4);printf(Theresultis%d,i);HHHnewfun2=(HHH)::GetProcAddress(hModule,fun2);//取得fun函数的地址intd=newfun2(6,4);printf(the6,4is:%d,d);intc=newfun2(7,19);printf(the7,19is:%d,c);::FreeLibrary(hModule);}二.隐式链接[cpp]viewplaincopyprint?1.#ifdefMYDLL_EXPORTS2.#defineMYDLL_API__declspec(dllexport)3.#else4.#defineMYDLL_API__declspec(dllimport)5.#endif6.7.classMYDLL_APIMyDll8.{9.public:10.MyDll(void);11.~MyDll(void);12.voidsetValue(intvalue);13.intgetValue();14.15.private:16.intm_nValue;17.};#ifdefMYDLL_EXPORTS#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endifclassMYDLL_APIMyDll{public:MyDll(void);~MyDll(void);voidsetValue(intvalue);intgetValue();private:intm_nValue;};使用dll代码[cpp:collapse]+expandsourceviewplaincopyprint?1.#includestdlib.h2.#includestdio.h3.#includewindows.h4.#includeMyDll.h5.#pragmacomment(lib,MyDll.lib)6.7.voidmain()8.{9.10.MyDllmyDll;11.myDll.setValue(20);12.inti=myDll.getValue();13.14.printf(%d,i);15.}#includestdlib.h#includestdio.h#includewindows.h#includeMyDll.h#pragmacomment(lib,MyDll.lib)voidmain(){MyDllmyDll;myDll.setValue(20);inti=myDll.getValue();printf(%d,i);}以下为转贴三。导出并显式链接一组C++成员函数这里有两个问题。第一是C++成员函数名是经过修饰的(即使指定externC标记也是这样);第二是C++不允许将指向成员函数的指针转换成其它类型。这两个问题限制了C++类的显式链接。下面介绍两种方法来解决这个问题:①用虚函数表的方法,这也是COM使用的方法;②用GetProcAddress直接调用。1.虚函数表方法:使用到的dll头文件MyDll.h[cpp:collapse]+expandsourceviewplaincopyprint?1.#ifdefMYDLL_EXPORTS2.#defineMYDLL_API__declspec(dllexport)3.#else4.#defineMYDLL_API__declspec(dllimport)5.#endif6.7.classMYDLL_APIMyDll8.{9.public:10.MyDll(void);11.MyDll(inti);12.virtual~MyDll(void);13.virtualvoidsetValue(intvalue);14.virtualintgetValue();15.16.private:17.intm_nValue;18.};#ifdefMYDLL_EXPORTS#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endifclassMYDLL_APIMyDll{public:MyDll(void);MyDll(inti);virtual~MyDll(void);virtualvoidsetValue(intvalue);virtualintgetValue();private:intm_nValue;};使用dll的代码[cpp:collapse]+expandsourceviewplaincopyprint?1.#includestdlib.h2.#includestdio.h3.#includestring4.#includewindows.h5.6.#includeMyDll.h7.8.typedefMyDll*(*pCreateA)();9.typedefMyDll*(*pCreateA1)(int);10.11.voidmain()12.{13.HMODULEhModule;14.15.hModule=::LoadLibrary(MyDll);//加载DLL库16.17.pCreateApCreate=(pCreateA)GetProcAddress(hModule,TEXT(CreateMyDll));18.19.MyDll*a=(pCreate)();20.a-setValue(20);21.printf(one:%d/n,a-getValue());22.23.24.25.pCreateA1pCreate1=(pCreateA1)GetProcAddress(hModule,TEXT(CreateMyDll1));26.27.MyDll*b=(pCreate1)(50);28.printf(two:%d/n,b-getValue());29.30.::FreeLibrary(hModule);31.32.getchar();33.return;34.}#includestdlib.h#includestdio.h#includestring#includewindows.h#includeMyDll.htypedefMyDll*(*pCreateA)();typedefMyDll*(*pCreateA1)(int);voidmain(){HMODULEhModule;hModule=::LoadLibrary(MyDll);//加载DLL库pCreateApCreate=(pCreateA)GetProcAddressdll项目MyDll.h即使用到的dll头文件MyDll.cpp[cpp:collapse]+expandsourceviewplai