2010-12-02 5 views
0

更新:これは、.NETクライアントが通常のDLLを呼び出しているときです。私はまた、いくつかのクラスをエクスポートし、通常のDLLで使用される別の拡張DLLを持っています。.NETクライアント - MFC正規DLLとユーザー定義メッセージ

WindowHandleとユーザー定義のメッセージをパラメータとして受け取り、渡されたウィンドウにメッセージを送信するサードパーティのDLLがありますが、自分のウィンドウにメッセージが表示されません。以下は、APIの呼び出し形式です:

StartMessaging(<WindowHandle>,WM_MESSAGE_API); 

私はちょうどメッセージを受信するために隠されたCFrameWndのウィンドウを作成する通常のMFC標準DLLを必要としていました。 また、DLLのすべてのエントリポイントでAFX_MANAGE_STATE()を使用しています。私のCFrameWndの派生クラスで

コンストラクタコード:

(NULL、 "mywindowを")を作成します。 hWndFrame = this-> m_hWnd;

メッセージマップ:

LRESULT CMyDerivedWnd::OnMsgApi(WPARAM wParam, LPARAM lParam) 
{ 
OutputDebugString("OnMsgApi"); 
return (LRESULT)0; 
} 

StartMessagingが呼ばれた私のメインクラス:コンストラクタで 私はCFrameWndのオブジェクトをインスタンス化:

myDerivedWnd =新しいCMyDerivedWnd(この);

、その後InitiateMessagingが呼び出されます。

void CMain::InitiateMessaging() 
{ 
    TCHAR szBuf[80]; 
    ::GetWindowText(myDerivedWnd->m_hWnd,szBuf,80); 
    OutputDebugString((LPSTR)(LPCTSTR)szBuf); //This displays MYWINDOW 
    StartMessaging(myDerivedWnd->m_hWnd,WM_MESSAGE_API); 
} 

マイGetWindowText関数は、正しいウィンドウの名前を返しますが、私はこのクラスのトラップWM_MESSAGE_APIメッセージすることができません。 私はまた、拡張DLLを使用してみましたが、同じ結果です。

+0

同じAPIで動作するサンプルのMFCダイアログベースのアプリケーションがあります。 – cloudnine

+0

この通常のDLLが.NETクライアントから呼び出されているのを忘れてしまいました。 – cloudnine

答えて

0

私は問題を見つけましたが、答えはまだありません。 C#側にスレッドがあって、イベントが表示されないようにしました.C++ Interopへの呼び出しがメインスレッド上にある場合、イベントは機能しますが、別のスレッド上に呼び出す必要があります。私は答えを見つけるために別の質問を投稿するつもりです。

関連する問題