0

我有一个 Winforms 应用程序,它在它的一个控件中托管了一个 C++ 应用程序(SUMATRA pdf 查看器进行了一些修改)。

我希望能够以两种方式发送 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;
}

如果我覆盖 C# Winforms 控件的消息处理,我将 Sumatra 查看器放在其中,它会有所帮助吗?

还是 C++ 代码有问题?

或者当我托管在另一个控件中时,通常不可能成为 DDE 服务器?

感谢您的回复

4

1 回答 1

0

事实证明,这是不可能的。在托管模式下,宿主应用程序需要改为 DDE 服务器。

于 2012-05-28T08:34:02.893 回答