0

コントロールの1つにC++アプリケーション(SUMATRA pdfビューアーにいくつかの変更を加えたもの)をホストするWinformsアプリケーションがあります。

DDEを双方向で送信できるようにしたいのですが、これはC++がスタンドアロンの場合に正常に機能します。ただし、ホストモードでは、WinformsアプリからSumatraへのDDE接続を開始できません。

私はC#でNDDeを使用しています。コードは次のとおりです。

    class SumatraCommander : DdeClient
{
    public SumatraCommander() : base("SUMATRA", "control") 
    {

    }


    public void MoveDocuments(ClientsQuestion question)
    {
        if (!this.IsConnected) this.Connect(); // this line fails only when sumatra 
//is hosted
    }
}

そしてこれはSumatraからのwinapiメッセージ処理です

case WM_DDE_INITIATE:           
        return OnDDEInitiate(hwnd, wParam, lParam);

機能の開始:

LRESULT OnDDEInitiate(HWND hwnd, WPARAM wparam, LPARAM lparam)
{
DBG_OUT("received WM_DDE_INITIATE from %p with %08lx\n", (HWND)wparam, lparam);

ATOM aServer = GlobalAddAtom(PDFSYNC_DDE_SERVICE);
ATOM aTopic = GlobalAddAtom(PDFSYNC_DDE_TOPIC);

if (LOWORD(lparam) == aServer && HIWORD(lparam) == aTopic) {
    if (!IsWindowUnicode((HWND)wparam))
        DBG_OUT("The client window is ANSI!\n");
    DBG_OUT("Sending WM_DDE_ACK to %p\n", (HWND)wparam);
    SendMessage((HWND)wparam, WM_DDE_ACK, (WPARAM)hwnd, MAKELPARAM(aServer, 0));
}
else {
    GlobalDeleteAtom(aServer);
    GlobalDeleteAtom(aTopic);
}
return 0;
}

Sumatraビューアを配置するC#Winformsコントロールのメッセージ処理をオーバーライドすると、役に立ちますか?

または、C ++コードに何か問題がありますか?

または、別のコントロールでホストされている場合、通常、DDEサーバーになることはできませんか?

返信ありがとうございます

4

1 に答える 1

0

これは不可能であることが判明しました。ホストモードでは、代わりにホストアプリケーションをDDEサーバーにする必要があります。

于 2012-05-28T08:34:02.893 に答える