c++ dll动态加载,c动态调用dll

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windows10缺少dll文件,win10运行时出错无法找到指定dll库文件
  • ,,详解VS2019 dumpbin查看DLL的导出函数
  • ,,解决采集时出现msxml3.dll 错误的方法
  • ,,使用 JScript 创建 .exe 或 .dll 文件的方法
  • ,,VC++ loadlibrary()加载三方dll失败, 返回错误码-126的解决方法
  • .net dll加密,c++ dll 反编译
  • .net dll加密,c++ dll 反编译,保护.net中的dll文件方法(防止破解、反编译dll)
  • .dll是什么文件能不能删除,文件dll怎么删除
  • dll没有在指定的windows上运行,xlivedll没有在windows上运行
  • 删除linkinfo.dll操作无法完成,因为已经在打开,linkinfo.dll是病毒吗
  • python能封装成dll文件吗,python自己封装的类怎么调用
  • 无法定位序数4445于动态链接库libcurl.dll,无法定位序数4445于动态链接库
  • d3dx9-43.dll文件丢失,d3dx9_41.dll文件丢失
  • igfxsrvc.exe木马病毒,igfxsrvc.dll加载失败_1
  • 怎么用360修复dll文件,360 dll文件修复
  • 留言与评论(共有 条评论)
       
    验证码: