这是一个老问题了。我对此简单地写了一个小结,有不足之处,还请指出,谢 谢。 调用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
E-mail: brierbird97@mails.tsinghua.edu.cn