这是一个老问题了。我对此简单地写了一个小结,有不足之处,还请指出,谢 谢。
调用DLL中的Dlg或SDI/MDI, 只是不能再使用APP类了,因为它是从CWinThread继承过来,内部的线程机制导出了问题的出现。
(1)对于调用DLL中的Dialog,很简单,直接调用就是
如: extern "C"
void LoadDialog()
{
CTestDlg dlg;
if (dlg.DoModal == IODK)
{
//......
}
}
(2)对于调用DLL中的SDI/MDI, 不那么直接。需要保证Doc/View和MainFrame之间的关联,因此得保留原来在APP中用的CDocTempate类及对它的使用。为此,我们可以自己建一个类如CSDIMain来做接替原来APP中的工作(当然不用类,就直接用问题也不大,毕竟都是创建工作都是在堆上进行的),
如:
BOOL CSDIMain::InitInstance()
{
// 创建模板
if(m_pTemplate == NULL)
{
m_pTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDIForTestDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDIForTestView));
}
CSDIForTestDoc* pDocument = new CSDIForTestDoc;
// 创建新的frame
CFrameWnd* pFrame = m_pTemplate->CreateNewFrame(pDocument, NULL);
if (NULL == pFrame)
{
AfxMessageBox("Create frame failed");
return FALSE;
}
m_pTemplate->InitialUpdateFrame(pFrame, pDocument);
return TRUE;
}
杨晓明 2002-5-11