这个问题已经郁闷了我快一天了,
我做了一个DLL用来实现非模式对话框资源的调用,然后这个DLL已经形成,具体的
导出函数如下:
void ShowDlg()
{
CMyDlg *pDlg=new CMyDlg();
pDlg->Create();
pDlg->ShowWindow();}然后在调用此DLL的应用程序的调用代码如下:
void CTestMyDllDlg::OnOK()
{
typedef void (WINAPI *SHOWDLG)();
SHOWDLG ShowDlg;
FARPROC lpfn=NULL;
HINSTANCE hinst=NULL;
hinst=LoadLibrary("MYFIRSTDLL.dll");
if(hinst==NULL)
{
AfxMessageBox("不加载动态连接库");
return;
}
lpfn=GetProcAddress(hinst,"ShowDlg");
ShowDlg=(SHOWDLG)lpfn;
if(lpfn==NULL)
AfxMessageBox("不加载测试函数");
else
ShowDlg();//调用动态连接库函数
}
每次调用的时候都是出现这样的错误:Debug Assertion Failed!
Program:.....TextMyDll.exe
File dlgcode.exe
Line 173 (TextMyDll.exe这是我的调用此DLL的应用程序)清高手指点到底是什么原因引导致的
我做了一个DLL用来实现非模式对话框资源的调用,然后这个DLL已经形成,具体的
导出函数如下:
void ShowDlg()
{
CMyDlg *pDlg=new CMyDlg();
pDlg->Create();
pDlg->ShowWindow();}然后在调用此DLL的应用程序的调用代码如下:
void CTestMyDllDlg::OnOK()
{
typedef void (WINAPI *SHOWDLG)();
SHOWDLG ShowDlg;
FARPROC lpfn=NULL;
HINSTANCE hinst=NULL;
hinst=LoadLibrary("MYFIRSTDLL.dll");
if(hinst==NULL)
{
AfxMessageBox("不加载动态连接库");
return;
}
lpfn=GetProcAddress(hinst,"ShowDlg");
ShowDlg=(SHOWDLG)lpfn;
if(lpfn==NULL)
AfxMessageBox("不加载测试函数");
else
ShowDlg();//调用动态连接库函数
}
每次调用的时候都是出现这样的错误:Debug Assertion Failed!
Program:.....TextMyDll.exe
File dlgcode.exe
Line 173 (TextMyDll.exe这是我的调用此DLL的应用程序)清高手指点到底是什么原因引导致的
{
CMyDlg *pDlg=new CMyDlg();
pDlg->Create(ID_DLG);//ID_DLG:对话框的ID号
pDlg->ShowWindow();}
http://community.csdn.net/Expert/topic/3081/3081869.xml?temp=.7213709
{
CMyDlg *pDlg=new CMyDlg();
pDlg->Create(ID_DLG);//ID_DLG:对话框的ID号
pDlg->ShowWindow();}可能是约定的问题造成函数返回时地址错误
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());//添加此行
CMyDlg *pDlg=new CMyDlg();
pDlg->Create();
pDlg->ShowWindow();
}
问题是解决了,
不过为什么必须加入
AFX_MANAGE_STATE(AfxGetStaticModuleState());这条语句呢?
想多学点,
谢谢。
相应的实际比较复杂,如果需要去看一下《深入理解MFC》好象是这本里讲的比较清楚。
这里出了问题,导致断言错误。看一下MFC中Create的原型:
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );第二个参数是对话框的父窗体,默认是NULL,实际上MFC是把进程句柄给过去了。但是,dll不是进程,里面并没有默认的进程句病,如果不调用AFX_MANAGE_STATE(AfxGetStaticModuleState());来指认当前进程的话,就会导致对话框找不到父窗体,明白了吗?
帮忙看一下!!!