2009-08-03 13 views
0

自分のPC VS2008とWindows Mobile 6 SDKにインストールしました。DLLからDlgをロードできないMFC

私はSmartDevice MFCアプリケーションと標準DLL MFCを作成しました。どちらも共有MFC DLLを使用しています。

DLLのDoModal()を呼び出すと、アプリケーションがハングアップし、「デバッグアサーションが失敗しました」というメッセージが表示され、デバイスがフリーズします。

私を助けることができますか?

コード:

EXEコード:

typedef BOOL (CALLBACK* LPFNDLLLOAD)(); 
typedef BOOL (CALLBACK* LPFNDLLRUN)(HINSTANCE, HWND, LPBYTE *, LONG *); 

BOOL CTesteExeDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    // Set the icon for this dialog. The framework does this automatically 
    // when the application's main window is not a dialog 
    SetIcon(m_hIcon, TRUE);   // Set big icon 
    SetIcon(m_hIcon, FALSE);  // Set small icon 

    //CModule mod; 
    //mod.Create(L"\\Program Files\\PMA\\Teste.dll"); 
    //mod.Run(AfxGetInstanceHandle(), GetSafeHwnd(), 0, 0); 

    HMODULE m_hModule = AfxLoadLibrary(L"\\Program Files\\PMA\\TesteDll.dll"); 
    LPFNDLLLOAD m_lpfnLoad= (LPFNDLLLOAD)GetProcAddress(m_hModule, _T("_Load")); 
    LPFNDLLRUN m_lpfnRun = (LPFNDLLRUN)GetProcAddress(m_hModule, _T("_Run")); 

    m_lpfnLoad(); 
    m_lpfnRun(AfxGetInstanceHandle(), GetSafeHwnd(), 0, 0); 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

DLLコード:

私はデフォルトCTesteDllAppクラスを削除し、これを置く:

#include "stdafx.h" 
#include "TesteDll.h" 
#include "TesteDllDlg.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

extern "C" BOOL PASCAL EXPORT _Load() 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    return TRUE; 
} 

extern "C" BOOL PASCAL EXPORT _Unload() 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    return TRUE; 
} 

extern "C" BOOL WINAPI EXPORT _Run(HINSTANCE hInst, 
            HWND hwndParent, 
            LPBYTE *buffer, 
            LONG *size) 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    CTesteDllDlg d; 
    d.DoModal(); ////-------------> Error Here 

    return FALSE; 
} 

DLLのDLGコード:

BOOL CTesteDllDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 

    AfxMessageBox(L"Oi"); 

    return TRUE; // return TRUE unless you set the focus to a control 
    // EXCEPTION: OCX Property Pages should return FALSE 
} 

DLL内のdefファイル ; TesteDll.def:DLLのモジュールパラメータを宣言します。同様の問題で

LIBRARY  "TesteDll" 

EXPORTS 
    ; Explicit exports can go here 
    _Load   @1 
    _Unload   @2 
    _Run   @3 
+0

アサーションの失敗は何ですか?ここにメッセージを印刷できますか?アサーションの失敗は、MFCソース内のいくつかのコードを指すはずです。それを見て参考になるかもしれません。 – Raj

答えて

1

、私は、DLLのダイアログのOnInitDialogを、OnKillActiveとOnSize関数方法でAFX_MANAGE_STATEマクロを使用する必要がありました。 OnKillActiveメソッドとOnSizeメソッドを追加するだけで、上記のマクロを呼び出すだけでした。マクロを呼び出してから、そのマクロを呼び出して戻ります。おそらく、あなたの場合にはうまくいくでしょう。

関連する問題