Сервер DDE не устанавливает соединение в режиме хоста - PullRequest
0 голосов
/ 20 января 2012

У меня есть приложение Winforms, в котором размещено приложение C ++ (программа просмотра PDF SUMATRA с некоторыми изменениями) внутри одного из его элементов управления.

Я хочу иметь возможность отправлять DDE в обоих направлениях, что работает нормальнокогда C ++ автономен. Однако в размещенном режиме я не могу инициировать подключение DDE из приложения Winforms к Суматре.

Я использую NDDe в C #, вот мой код:

    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
    }
}

И это обработка сообщений 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, в который я помещаю средство просмотра Суматры?

Или что-то не так в коде C ++?

Или вообще невозможно быть сервером DDE, когда я размещаюсь веще один элемент управления?

Спасибо за ответы

1 Ответ

0 голосов
/ 28 мая 2012

Оказалось, что это невозможно. В размещенном режиме хост-приложение должно быть сервером DDE.

...