c++ dll动态加载,c动态调用dll
Yyds干货库存
本节内容1、问题描述2、解决方案2.1用于DLL接口函数:2.2用于DLL接口函数2: 2.3由应用自行切换。后记1,问题描述//将线程状态切换回应用程序
_ AFX _ THREAD _ STATE * p STATE=AfxGetThreadState();
AfxSetModuleState(pState-m _ pPrevModuleState);
//对应用程序做一些事情
AfxGetApp()- …
//将线程状态切换回dll
AFX _ MANAGE _ STATE(AfxGetStaticModuleState())
我们知道,CWINAP在MFC应用程序中代替了SDK程序中的WinMain,WinMain在SDK程序中所做的工作是由CWINAP的三个函数来完成的:
虚拟BOOL init application();虚拟BOOL InitInstance();虚拟BOOL Run();MFC程序传说中的“活水之源”
但是,MFC常规DLL不是MFC应用程序,它从CWinApp继承的类不包含消息循环。这是因为MFC常规DLL不包含CWinApp:Run机制,主消息泵仍归应用程序所有。如果DLL生成无模式对话框或有自己的主框架窗口,则应用程序的主消息泵必须调用从DLL导出的函数来调用PreTranslateMessage成员函数。
此外,MFC常规dll和MFC应用程序一样,需要将dll中所有元素的初始化放入InitInstance成员函数中。
与非MFC DLL完全一样,我们可以使用__declspec(dllexport)来声明或派生中的party。净化
在MFC常规DLL中导出接口。
常规DLL共享MFC DLL(或MFC扩展DLL)涉及到HINSTANCE句柄的问题,这对于加载资源尤为重要。EXE和DLL都有自己的资源,这些资源的id可能是重复的,所以应用程序需要切换资源模块来找到合适的资源。如果应用程序需要DLL中的资源,应将资源模块句柄指定为DLL的模块句柄;如果需要EXE文件中包含的资源,应该将资源模块句柄指定为EXE的模块句柄。
2.解决方案这个问题的根本原因在于,与MFC常规DLL共享MFC DLL(或MFC扩展DLL)的应用程序默认情况下总是使用EXE的资源。我们必须切换资源模块的句柄,有三种实现方式:
2.1在DLL接口函数中的使用:afx _ manage _ state(afxgetstaticmodulestate());
void ShowDlg(void)
{
//方法1:在函数开始时更改,在函数结束时还原
//作为接口函数的第一个//语句,切换模块状态。
//设置afx _ manage _ state(afxgetstaticmodulestate());
AFX _ MANAGE _ STATE(AfxGetStaticModuleState());
CDialog DLG(IDD _ DLL _ DIALOG);//打开ID为2000的对话框
dlg。DoModal();
}2.2在DLL接口函数中使用2:afxgetresourceHandle();
AfxSetResourceHandle(h instance XXX);
extern cshareddlapptheapp;//您需要在应用程序外部声明全局变量
void ShowDlg(void)
{
//方法2的状态改变
h instance save _ h instance=AfxGetResourceHandle();
AfxSetResourceHandle(the app . m _ h instance);
CDialog DLG(IDD _ DLL _ DIALOG);//打开ID为2000的对话框
dlg。DoModal();
//方法2的状态还原
AfxSetResourceHandle(save _ hin instance);
//使用方法2之后,这里的操作将针对应用程序的资源。
CDialog DLG 1(IDD _ DLL _ DIALOG);//打开ID为2000的对话框
dlg1。DoModal();
} 2.3 Void csharedlcalldlg:OnCallDLLButton()由应用程序自己切换。
{
//方法三:应用程序自己切换状态。
//获取EXE模块句柄
h instance exe _ h instance=GetModuleHandle(NULL);
//或者hinstanceexe _ h instance=afxgetresourceHandle();
//获取DLL模块句柄
h instance dll _ h instance=GetModuleHandle( shared dll . dll );
AfxSetResourceHandle(dll _ hin instance);//开关状态
show DLG();//此时显示DLL的对话框
AfxSetResourceHandle(exe _ hin instance);//恢复状态
//资源模块恢复后调用ShowDlg。
show DLG();//此时显示EXE的对话框。
}后记如果你觉得这些话用处不大,可以给作者点个赞;( ̄ ̄)
如果你觉得作者的文笔不那么good//(12 o _ o?
谢谢小伙伴们(’)(`)!
爱看书的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。