Клиент .NET - MFC Regular DLL и пользовательские сообщения - PullRequest
0 голосов
/ 03 декабря 2010

ОБНОВЛЕНИЕ: это клиент .NET, выполняющий вызов обычной библиотеки DLL. У меня также есть другая библиотека DLL расширения, которая экспортирует некоторый класс и используется в обычной библиотеке DLL.

У меня есть сторонняя DLL, которая принимает WindowHandle и пользовательское сообщение в качестве параметра и начинает отправлять сообщения в переданное окно, но я не вижу сообщений, приходящих в мое окно. Ниже приведен формат вызова API:

StartMessaging(<WindowHandle>,WM_MESSAGE_API);

Мне нужна была обычная MFC Regular DLL, которая создаст скрытое окно CFrameWnd только для получения сообщений. Я также использую AFX_MANAGE_STATE () во всех точках входа в DLL.

Код конструктора в моем производном классе CFrameWnd:

Создать (NULL, "MyWindow"); hWndFrame = this-> m_hWnd;

Карты сообщений:

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

Мой основной класс, где вызывается StartMessaging: В конструкторе я создаю экземпляр объекта CFrameWnd:

myDerivedWnd = new CMyDerivedWnd (this);

и затем 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, но тот же результат.

1 Ответ

0 голосов
/ 06 декабря 2010

Я нашел проблему, но пока нет ответа. Это была многопоточность на стороне C #, в результате чего событие не показывалось. Если вызов C ++ Interop находится в основном потоке, событие работает, но мне нужно, чтобы вызов находился в отдельном потоке. Я планирую опубликовать еще один вопрос, чтобы найти ответ.

...