0

非モーダルウィンドウを開く関数を使用してDLLを作成しました。

class CMainFrame : public CFrameWnd
{
protected:
    CMainFrame() {}
    DECLARE_DYNCREATE(CMainFrame)
public:
    virtual void PostNcDestroy()
    { AfxPostQuitMessage(0); }
public:
    virtual ~CMainFrame() {}
};
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

class CDllApp : public CWinApp
{
public:
    CDllApp() :
        m_pDocTemplate(NULL)
    {};
public:
    virtual BOOL InitInstance()
    {
        CWinApp::InitInstance();
        m_pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(C3DGraphDoc),
            RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(C3DGraphView));
        return TRUE;
    }
public:
    CMultiDocTemplate* m_pDocTemplate;
};

CDllApp theApp;

class C3DThread : public CWinThread
{
    DECLARE_DYNCREATE(C3DThread)
public:
    virtual BOOL InitInstance()
    {
        theApp.m_pDocTemplate->OpenDocumentFile(NULL);
    }
};
IMPLEMENT_DYNCREATE(C3DThread, CWinThread)

void __stdcall ExportedFunction()
{
    AfxBeginThread(RUNTIME_CLASS(C3DThread));
}

メインアプリケーションを終了する前にすべてのウィンドウを閉じると、すべて正常に見えます。そうしないと、スレッドがハングします。ですから、開いているすべてのドキュメントを閉じてクリーンアップする必要があると思います。それを適切に行うための最も簡単な方法は何でしょうか。m_pDocTemplate->CloseAllDocuments()ドキュメントのフレームウィンドウは異なるスレッドに属しているため、Appからは機能しません。

4

0 に答える 0