Отправляет email-рассылки с помощью сервиса Sendsay

Школа программирования

  Все выпуски  

Школа программирования


Помощь в отладке.

Бывает, что нужно посмотреть значения переменных, что называется в реальном времени. Или, например, посмотреть в каком порядке вызываются методы классов в многопоточном приложении. Или посмотреть как взаимодействуют два или несколько приложений. Да мало ли в каких случаях необходимо собрать данные, не останавливая приложение. Самое простое решение - это лог. Это конечно не плохо, но есть еще способ (и не один). В Windows есть такая возможность - передача данных между процессами, используя сообщение WM_COPYDATA. Для использования этого способа нужно написать две программных части. Первая - что-то типа сервера - приложение, которое будет получать сообщения. Вторая - макрос, который будет искать наш сервер и отправлять ему данные. Вместо макроса можно написать оформить вторую часть как глобальную функцию или же создать класс с соответствующим методом. Вот так я реализовал этот макрос SendMessageTo.

#ifdef _DEBUG #define SendMessageTo(mess) { \
HWND hwnd=::FindWindow(NULL,"MessageViewer");\
COPYDATASTRUCT cd; \
char buffer[2000]; \
CStr _str2;\
_str2.Format("(Thread id: %d)",GetCurrentThreadId());\
strcpy(buffer,mess+_str2); \
cd.lpData=&buffer; \
cd.cbData= sizeof(buffer); \
if (hwnd != NULL) { ::SendMessage(hwnd,WM_COPYDATA, 0, (LPARAM) &cd);} \
} #else
#define SendMessageTo(mess) { }
#endif
Этот макрос ищет окно MessageViewer и отправляет ему сообщение WM_COPYDATA с буффером в 2000 байт.  Сервер реализуется так:

BOOL CMessageViewerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) {
char buffer[2000];
strcpy(buffer,(char *)pCopyDataStruct->lpData); CString str = buffer;
m_list_box.AddString(str);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
Есть в этом коде два неудобных момента.
  1. Используется библиотека MFC.
  2. Выделяется буфер одного размера.

Как обойти эти моменты расскажу в следующий раз:) До встречи!

В избранное