Попытался попробовать плагин на MSVC, заработало всё кроме инициирования события, код:
Код: Выделить всё
//---------------------------------------------------------------------------
#include <windows.h>
#include <string>
#include <time.h>
#include <iostream>
#include <sstream>
#pragma hdrstop
void logprintf(char * format, ...)
{
if(true)
{
char tmp_buf[512];
va_list args;
FILE* file;
va_start(args, format);
vsprintf(tmp_buf, format, args);
va_end(args);
puts(tmp_buf);
file = fopen("plugin.log", "a");
if(true)
{
time_t rawtime;
struct tm * timeinfo;
char sztime[80];
//char *result = NULL;
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(sztime, 80, "%H:%M:%S", timeinfo);
//result = strtok(tmp_buf, "\n");
fprintf(file, "[%s] %s\n", sztime, tmp_buf);
}
else
{
fprintf(file, "%s\n", tmp_buf);
}
fclose(file);
}
}
#include "UTF8.h"
DWORD dwPluginID;
typedef VOID (__stdcall *typeCommFortProcess)(DWORD dwPluginID, DWORD dID, BYTE * bOutBuffer, DWORD dwOutBufferSize);
typedef DWORD (__stdcall *typeCommFortGetData)(DWORD dwPluginID, DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize, BYTE * bOutBuffer, DWORD dwOutBufferSize);
typeCommFortProcess CommFortProcess;
typeCommFortGetData CommFortGetData;
extern "C" __declspec(dllexport) BOOL PluginStart(DWORD dwThisPluginID, typeCommFortProcess, typeCommFortGetData);
extern "C" __declspec(dllexport) VOID PluginStop();
extern "C" __declspec(dllexport) VOID PluginProcess(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize);
extern "C" __declspec(dllexport) DWORD PluginGetData(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize, BYTE * bOutBuffer, DWORD dwOutBufferSize);
extern "C" __declspec(dllexport) BOOL PluginPremoderation(DWORD dwID, wchar_t * wText, DWORD *dwTextLength);
extern "C" __declspec(dllexport) VOID PluginShowOptions();
extern "C" __declspec(dllexport) VOID PluginShowAbout();
//---------------------------------------------------------------------------
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
int iOffset, i2;
memcpy(&iOffset,&i2,4);
logprintf("DllMain");
return 1;
}
std::string fTextToAnsiString(std::wstring uText) //вспомогательная функция для упрощения работы с данными
{
//функция предназначена для ознакомительных целей,
//не рекомендуется для реального применения,
//так как при ее использовании проявляется избыточное копирование данных
std::string ret;
std::stringstream ss;
ss << uText.length();
ss << utf8_wcstombs(uText);
ss >> ret;
return ret;
}
//---------------------------------------------------------------------------
std::string fIntegerToAnsiString(int iValue) //вспомогательная функция для упрощения работы с данными
{
std::string aReturn;
std::stringstream ss;
ss << iValue;
ss >> aReturn;
return aReturn;
}
BYTE * fAnsiStringToByte(const char * szText)
{
BYTE * out = new BYTE[strlen(szText)];
for(int i = 0; i <= strlen(szText); i++)
{
out[i] = szText[i];
}
out[strlen(szText)] = '\0';
return out;
}
//---------------------------------------------------------------------------
int fReadInteger(BYTE * bInBuffer, int * iOffset) //вспомогательная функция для упрощения работы с чтением данных
{
int iLength;
memcpy(&iLength, bInBuffer + (*iOffset),4);
(*iOffset)+=4;
return iLength;
}
//---------------------------------------------------------------------------
std::wstring fReadText(BYTE * bInBuffer, int * iOffset) //вспомогательная функция для упрощения работы с чтением данных
{
int iLength;
memcpy(&iLength, bInBuffer + (*iOffset),4);
(*iOffset)+=4;
wchar_t * uRet = new wchar_t[iLength+1];
for(int i = 0; i < iLength; i++)
{
memcpy(&uRet[i], bInBuffer + (*iOffset)+(i*2), 2);
}
(*iOffset)+=iLength*2;
uRet[iLength] = '\0';
std::wstring str = uRet;
std::string s = utf8_wcstombs(str);
return str;
}
//---------------------------------------------------------------------------
void fWriteInteger(BYTE * bOutBuffer, int iOffset, int iValue) //вспомогательная функция для упрощения работы с записью данных
{
memcpy(bOutBuffer + iOffset, &iValue, 4);
iOffset+=4;
}
//---------------------------------------------------------------------------
void fWriteText(BYTE * bOutBuffer, int * iOffset, std::wstring uValue) //вспомогательная функция для упрощения работы с записью данных
{
int iLength = uValue.length();
memcpy(bOutBuffer + (*iOffset),&iLength,4);
(*iOffset)+=4;
memcpy(bOutBuffer + (*iOffset),uValue.c_str(),iLength*2);
(*iOffset)+=iLength*2;
}
//---------------------------------------------------------------------------
BOOL PluginStart(DWORD dwThisPluginID, typeCommFortProcess func1, typeCommFortGetData func2)
{
dwPluginID = dwThisPluginID;
//При инициализации планину присваивается уникальный идентификатор
//его необходимо обязательно сохранить, и указывать
//в качестве первого параметра при инициировании событий
CommFortProcess = func1;
//указываем функцию обратного вызова,
//с помощью которой плагин сможет инициировать события
CommFortGetData = func2;
//указываем функцию обратного вызова,
//с помощью которой можно будет запрашивать необходимые данные от программы
//Пример получения данных от программы (получение типа программы):
int iSize = (*CommFortGetData)(dwPluginID, 2000, NULL, NULL, NULL, NULL); //получаем объем буфера
BYTE * cData = new BYTE[iSize];
(*CommFortGetData)(dwPluginID, 2000,cData,iSize, NULL, NULL);//заполняем буфер
int iProgramType;
memcpy(&iProgramType,cData,4);//копируем число
if(iProgramType==0)
logprintf("Плагин успешно запущен на сервере CommFort");
else if(iProgramType==1)
logprintf("Плагин успешно запущен на клиенте CommFort");
logprintf("Plugin started.");
//Возвращаемые значения:
//TRUE - запуск прошел успешно
//FALSE - запуск невозможен
return TRUE;
}
//---------------------------------------------------------------------------
VOID PluginStop()
{
logprintf("Plugin stopped.");
//данная функция вызывается при завершении работы плагина
}
//---------------------------------------------------------------------------
VOID PluginProcess(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize)
{
logprintf("PluginProcess: [%d] [%s] [%d]", dwID, bInBuffer, dwInBufferSize);
//Функция приема событий
//Параметры:
//dwID - идентификатор события
//bInBuffer - указатель на данные
//dwInBufferSize - объем данных в байтах
int iReadOffset = 0;
if(dwID==5) //личное сообщение
{
std::wstring userName = fReadText(bInBuffer, &iReadOffset);
std::wstring ip = fReadText(bInBuffer, &iReadOffset);
int userType = fReadInteger(bInBuffer, &iReadOffset);
std::wstring chanName = fReadText(bInBuffer, &iReadOffset);
int type = fReadInteger(bInBuffer, &iReadOffset);
std::wstring text = fReadText(bInBuffer, &iReadOffset);
std::string send = fTextToAnsiString(L"unix-net") + fIntegerToAnsiString(0) + fTextToAnsiString(text);
logprintf("send: %s", fAnsiStringToByte(send.c_str()), sizeof(BYTE));
(*CommFortProcess)(dwPluginID,50,fAnsiStringToByte(send.c_str()),send.length());
}
}
//---------------------------------------------------------------------------
DWORD PluginGetData(DWORD dwID, BYTE * bInBuffer, DWORD dwInBufferSize, BYTE * bOutBuffer, DWORD dwOutBufferSize)
{
//функция передачи данных программе
int iReadOffset = 0; //вспомогательные переменные для упрощения работы с блоком данных
int iWriteOffset = 0;
//при значении dwOutBufferSize равным нулю функция должна вернуть объем данных, ничего не записывая
if(dwID==2800) //предназначение плагина
{
if(dwOutBufferSize==0)
return 4; //объем памяти в байтах, которую необходимо выделить программе
fWriteInteger(bOutBuffer,iWriteOffset,0); //плагин подходит как для клиента, так и для сервера
return 4;//объем заполненного буфера в байтах
}
else if(dwID==2810) //название плагина (отображается в списке)
{
std::wstring uName(L"NULL: тест");//название плагина
int iSize = uName.length()*2+4;
if(dwOutBufferSize==0)
return iSize; //объем памяти в байтах, которую необходимо выделить программе
fWriteText(bOutBuffer, &iWriteOffset, uName);
return iSize;//объем заполненного буфера в байтах
}
return 0;//возвращаемое значение - объем записанных данных
}
//---------------------------------------------------------------------------
VOID PluginShowOptions()
{
//данная функция вызывается при нажатии кнопки "Настроить" в списке плагинов
//если Вы не желаете чтобы активировалась кнопка "Настроить", просто сотрите данную функцию
// ShowMessage(L"Options dialog");
}
//---------------------------------------------------------------------------
VOID PluginShowAbout()
{
//данная функция вызывается при нажатии кнопки "О плагине" в списке плагинов
//если Вы не желаете чтобы активировалась кнопка "Настроить", просто сотрите данную функцию
// ShowMessage(L"Test plugin for CommFort 5\n\nCreated by CommFort software Ltd.");
}
//---------------------------------------------------------------------------
[10.02.2011 13:03:49] Ошибка при обработке программой сообщения от плагина "commfort_null.cfplug" c ID=50. Плагин остановлен.
Сообщение из лога, текст из std::string send.c_str(): [12:52:24] send: 8unix-net04text