Страница 2 из 42

Re: Технология создания плагинов и программ-дополнений

Добавлено: 16:31, 17.09.2008
sonic
Ув. разработчики.
Помоему описание команды

Код: Выделить всё

Подключение к каналу бота	62	Текст(канал)+текст(тема)+текст(приветствие)
не соответствует действительности:

Код: Выделить всё

04 00 00 00 6d 61 69 6e 1c 00 00 00 04 f2 e5 ec    ....main.....тем
e0 10 31 37 2e 30 39 2e 32 30 30 38 20 31 36 3a    а.17.09.2008 16:
32 38 05 4d 69 74 65 6b 00 00 00 00 0d 0a          28.Mitek......

Re: Технология создания плагинов и программ-дополнений

Добавлено: 10:37, 18.09.2008
Maxim Mirgorodsky
действительно.

правильное описание:
Текст(канал)+текст(текст1(тема)+текст1(дата и время последнего изменения темы)+текст1(логин пользователя изменившего тему последний раз))+текст(приветствие)

где текст1() = 1байт unsigned(длина строки)+текст

Проблема с передачей данных (plugin)

Добавлено: 20:22, 25.09.2008
Chief
Серверная часть вызывает PluginInit и на этом все (далее вызовов PluginProcess нет!). В логах сервера ошибок нет...
Компилятор: VC++ 9.0 (Visual Studio 2008)

Код: Выделить всё

#include <windows.h>
#include <string.h>

#ifdef __cplusplus
extern "C" {
#endif

#pragma pack(push)
#pragma pack(1)

#define __export __declspec(dllexport)

bool APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
	}
	return TRUE;
}

struct sPluginInfo
{
	char strPluginName[255];
	char strPluginDescription[255];
	char strPluginVersion[255];
};

struct sBotUserInfo
{
	char strBotName[255];
	char strBotPassword[255];
	bool bIsFemale;
};

DWORD dwPluginID;

typedef BYTE (__stdcall * typeCommFortProcess)(DWORD dwPluginID, DWORD dwMessageID, BYTE * bMessage, DWORD dwMessageLength);

typeCommFortProcess CommFortProcess;

__export BYTE __cdecl PluginInit(DWORD dwThisPluginID, sPluginInfo * plInfo, sBotUserInfo * botInfo, typeCommFortProcess func1)
{
	dwPluginID = dwThisPluginID;

	strcpy_s((* plInfo).strPluginName, "Null");
	strcpy_s((* plInfo).strPluginDescription, "Null");
	strcpy_s((* plInfo).strPluginVersion, "4.02");

	strcpy_s((* botInfo).strBotName, "bot");
	strcpy_s((* botInfo).strBotPassword, "password");

	(* botInfo).bIsFemale = false;

	CommFortProcess = func1;

	return 0;
}

__export BYTE __cdecl PluginTerminate(void)
{
	return 0;
}

__export BYTE __cdecl PluginProcess(DWORD dwMessageID, BYTE * bMessage, DWORD dwMessageLength)
{
	return 0;
}

__export BYTE __cdecl Premoderation(DWORD dwMessageID, BYTE * bMessage, DWORD * dwMessageLength)
{
	return false;
}

#ifdef __cplusplus
}
#endif
Исходник:
http://rapidshare.com/files/148321352/C ... s.zip.html

Собраный:
http://rapidshare.com/files/148321730/A ... k.zip.html

Re: Технология создания плагинов и программ-дополнений

Добавлено: 03:29, 26.09.2008
Maxim Mirgorodsky
Используется соглашение не __cdecl, а __stdcall.
__export BYTE __cdecl Premoderation
Правильно: __export BOOL

Re: Технология создания плагинов и программ-дополнений

Добавлено: 10:29, 26.09.2008
Chief
2Maxim Mirgorodsky

Вызовы при __cdecl (export C):

Код: Выделить всё

PluginInit PluginProcess PluginTerminate Premoderation
Вызовы при __stdcall (export C):

Код: Выделить всё

_PluginInit@16 _PluginProcess@12 _PluginTerminate@0 _Premoderation@12
P. S. CommFort_server вызывает функцию PluginInit, но после возврата ничего не происходит, т.е. бот регистрацию не проходит (вот о чем шла речь).

Re: Технология создания плагинов и программ-дополнений

Добавлено: 12:10, 26.09.2008
Maxim Mirgorodsky
Декорирование имен экспортируемых функций необходимо отключить.

Виртуальный пользователь может не пройти авторизацию в случае использования запрещенных символов в имени пользователя, либо в случае неверного пароля.

Re: Технология создания плагинов и программ-дополнений

Добавлено: 22:18, 27.09.2008
Chief
На будущее:

Для MSVC
1. В командную строку линковщика добавляете /DEF:<filename.def>;
2. В <filename.def>:

Код: Выделить всё

LIBRARY <filename.def>
EXPORTS 
	PluginInit
	PluginTerminate
	PluginProcess
	Premoderation
Проблема связана с различием в в именовании экспортируемых функций соглашением __stdcall в BCB и MSVC.

Re: Технология создания плагинов и программ-дополнений

Добавлено: 04:23, 29.09.2008
Maxim Mirgorodsky
Chief

Это называется декорированием имен функций. В плагинах для CommFort оно не используется как раз для совместимости с разными средами программирования. В различных средах отключение декорирования делается по-разному. В MSVC один из способов - тот что Вы описали.

Выход из привата (Delphi).

Добавлено: 05:30, 29.09.2008
dv
[Cообщeние yдалено]

Re: Выход из привата (Delphi).

Добавлено: 09:20, 29.09.2008
Maxim Mirgorodsky
Попробуйте не сразу выходить. Команда публикации сообщения в приват отправляет запрос серверу, сервер возвращает клиенту информацию о доставке сообщения и в этот момент сообщение публикуется, то есть, если приват был закрыт, он откроется заново.

Re: Выход из привата (Delphi).

Добавлено: 09:56, 29.09.2008
dv
[Cообщeние yдалено]

Re: Выход из привата (Delphi).

Добавлено: 12:09, 29.09.2008
Maxim Mirgorodsky
В данном случае более корректным будет не устанавливать паузу, а перехватывать событие публикации в приватный канал. И именно с этим событием связать закрытие канала. Потому что среда бывает разной, в некоторых сетях ответ от сервера может задержаться на несколько секунд.

Re: Технология создания плагинов и программ-дополнений

Добавлено: 03:23, 30.09.2008
Maxim Mirgorodsky
Хотелось бы поинтересоваться у разработчиков плагинов - есть ли какие-либо пожелания?

Re: Технология создания плагинов и программ-дополнений

Добавлено: 08:21, 30.09.2008
NexxGen
Возможность преключения плагина в "скрытый" режим, т.е. плагин работает, но в чате ввиде отдельного пользователя не отображается.

Re: Технология создания плагинов и программ-дополнений

Добавлено: 15:20, 12.10.2008
NexxGen
Клиент Commfort 4.02, при изменении состояния, НЕ отправляет пакеты на порт бота!