mfc扩展dll的调用以及dll中creat出错分析

来源:互联网 发布:vb语言入门教程 编辑:程序博客网 时间:2024/04/16 22:15

一、exe中按钮相应dll调用

       typedef void (*lpFun)(void);

        HINSTANCE exe_hInstance=GetModuleHandle(NULL);   //获取exe资源
HINSTANCE dll_hInstance=LoadLibrary("ScheduleSystem.dll");//加载dll
if (NULL==dll_hInstance)
{
MessageBox("DLL加载失败");
return;
}
AfxSetResourceHandle(dll_hInstance);
lpFun addFun;  //函数指针
lpFun pShowDlg = (lpFun)GetProcAddress(dll_hInstance,"ShowDlg");//获取函数指针
if (NULL==pShowDlg)
{
MessageBox("DLL中函数寻找失败");
return;
}
  pShowDlg();


AfxSetResourceHandle(exe_hInstance);

二、dll中函数的定义

       extern "C" _declspec(dllexport) void ShowDlg(void)
      {

/*HINSTANCE save_hInstance = AfxGetResourceHandle(); */
/*AfxSetResourceHandle(theInstance); */
/*AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0);*/
/*AFX_MANAGE_STATE(AfxGetStaticModuleState());*/


if(m_bOnSchedule)//bool变量标志对话框的存在,不存在创建
{
return;
}
CScheduleSystemDlg *dlg=NULL;


dlg= new CScheduleSystemDlg;


dlg->Create(IDD_SCHEDULESYSTEM_DIALOG);


dlg->ShowWindow(SW_MAXIMIZE);

m_bOnSchedule=TRUE;
}

三、creat对话框常见错误分析

     1、Debug Assertion Failed,并出现AfxGetResourceHandle()断言错误

     上网查了很多资料很多都说是因为资源切换的问题,但是我在应用程序中,已经进行了资源切换,应该不存在这个问题了啊!!所以我又在dllmain中定义了变量HINSTANCE theInstance,重新设置了资源,但是又出现了新的问题:

BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
   ENSURE(this != NULL);//在这里错误

   。。。。。。。。。

}

很多网友也遇见了这样的问题,主要是我原来有个DLL调用方式和上面的一模一样,所以我就想可能是我哪里设置的问题,所以我仔细对比了两个DLL,发现两个dll属性中字符集不一样,所以我将dll中字符集设置成:使用多字节字符集

重新编译,OK 了,我又将dll中重新设置的资源去掉,发现编译成功。

原来是属性中字符集的问题!!纠结了我两三天!!


原创粉丝点击