共享DLL 和静态库DLL

来源:互联网 发布:全炫茂 知乎 编辑:程序博客网 时间:2024/06/05 18:55


一 编写DLL

第一种含有 DLLMAIN的 WIN32 DLL






#include "stdafx.h"BOOL APIENTRY DllMain( HMODULE hModule,                       DWORD  ul_reason_for_call,                       LPVOID lpReserved ){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}



在要导出的类前面

AFX_EXT_CLASS


class AFX_EXT_CLASS GudianVClass{










另一种是MFC DLL 不含DLLMain


#include "stdafx.h"#include "MFCLibrary3.h"#ifdef _DEBUG#define new DEBUG_NEW#endif////TODO:  如果此 DLL 相对于 MFC DLL 是动态链接的,//则从此 DLL 导出的任何调入//MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到//该函数的最前面。////例如: ////extern "C" BOOL PASCAL EXPORT ExportedFunction()//{//AFX_MANAGE_STATE(AfxGetStaticModuleState());//// 此处为普通函数体//}////此宏先于任何 MFC 调用//出现在每个函数中十分重要。  这意味着//它必须作为函数中的第一个语句//出现,甚至先于所有对象变量声明,//这是因为它们的构造函数可能生成 MFC//DLL 调用。////有关其他详细信息,//请参阅 MFC 技术说明 33 和 58。//// CMFCLibrary3AppBEGIN_MESSAGE_MAP(CMFCLibrary3App, CWinApp)END_MESSAGE_MAP()// CMFCLibrary3App 构造CMFCLibrary3App::CMFCLibrary3App(){// TODO:  在此处添加构造代码,// 将所有重要的初始化放置在 InitInstance 中}// 唯一的一个 CMFCLibrary3App 对象CMFCLibrary3App theApp;// CMFCLibrary3App 初始化BOOL CMFCLibrary3App::InitInstance(){CWinApp::InitInstance();return TRUE;}


在要导出的类前面

#define DllExport   __declspec( dllexport )

class DllExport  Factory{public:static GudianVClass *GetGudianV();static void Destory();private:static CGudianView* pView;};

如果还不行的话,其它要导出的子类前添加

AFX_EXT_CLASS


class AFX_EXT_CLASS GudianVClass{


二 工程中使用DLL


1  工程编译只需LIB

    因为编译EXE时,只需LIB将DLL函数地址写入即可


2 EXE运行时,只需DLL

   因为LIB信息已经编译到EXE中了


3 debug/release 下编译时,使用不同版本的LIB和DLL

为方便 ,可以通过#ifdef _DEBUG  自动判断是debug版本还是release版本






#ifdef _DEBUG#define new DEBUG_NEW//第二步之二 加载LIB debug 和 release 不同模式的LIB#pragma comment( lib, "gudianDllHead\\gudian_debug.lib" )  //添加LIB库#else#pragma comment( lib, "gudianDllHead\\gudian_release.lib" )#endif


4  DLL放入子目录   通过延迟加载  隐形实现




在调用DLL前 ,通过SetDllDirectory设置DLL路径


Dlg::OnInitDialog(){CDialogEx::OnInitDialog();TCHAR szPath[255];GetModuleFileName(NULL, szPath, 255);*(_tcsrchr(szPath, _T('\\')) + 1) = 0;exeDirPath = szPath;  // 含有\符CString dllPath=exeDirPath+L"mantangcai\\";SetDllDirectory(dllPath);


古典界面库网址

0 0
原创粉丝点击