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

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

  Все выпуски  

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


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

Итак. Нужно решить как обойти ограничение в 2000 байт и использование MFC в макросе SendMessageTo. Используем (Standard Template Library, STL), вместо CString из MFC

#ifdef _DEBUG 
#include <stdio.h>
#include <stdarg.h>
#include <string>

inline std::string format_arg_list(const char *fmt, va_list args)
{
if (!fmt) return "";
int result = -1, length = 256;
char *buffer = 0;
while (result == -1)
{
if (buffer) delete [] buffer;
buffer = new char [length + 1];
memset(buffer, 0, length + 1);
result = _vsnprintf(buffer, length, fmt, args);
length *= 2;
}
std::string s(buffer);
delete [] buffer;
return s;
}

inline std::string format(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
std::string s = format_arg_list(fmt, args);
va_end(args);
return s;
}

#define SendMessageTo(mess) { \
HWND hwnd=::FindWindow(NULL,"MessageViewer");\
COPYDATASTRUCT cd; \
std::string str_message;\
std::string str_mes2 = mess;\
str_message = format("(Process id: %d) %s (Thread id: %d) ", GetCurrentProcessId(),str_mes2.c_str(), GetCurrentThreadId());\
cd.lpData=(void*)str_message.c_str(); \
cd.cbData= str_message.size(); \
if (hwnd != NULL) { ::SendMessage(hwnd,WM_COPYDATA, 0, (LPARAM) &cd);} \
}
#else
#define SendMessageTo(mess) {}
#endif
Этот макрос ищет окно MessageViewer и отправляет ему сообщение WM_COPYDATA.  Сервер реализуется так:

BOOL CMessageViewerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{

((char*)(pCopyDataStruct->lpData))[pCopyDataStruct->cbData-1]='\0';

AfxMessageBox((char*)pCopyDataStruct->lpData);

return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
Вот так:) В качестве домашнего задания можете написать приложение, которое будет выводить получаемые сообщения в CListCtrl, работающий в виртуальном режиме и добавить функцию поиска по CListCtrl.


В избранное