Подскажите!

Здесь обсуждаются технические аспекты создания дополнений.
Treibl
Сообщения: 29
Зарегистрирован: 09:24, 21.09.2011

Подскажите!

Сообщение Treibl »

Как получить состояние активного пользователя! При моём коде Commfort просто вылетает!
iSize := CommFortGetData(13, nil, 0, nil, 0);
SetLength(aData, iSize);
CommFortGetData(13, PAnsiChar(aData), iSize, nil, 0);
iReadOffset := 1;
count := fReadInteger(PAnsiChar(aData), iReadOffset);
Maxim Mirgorodsky
Администратор
Сообщения: 6867
Зарегистрирован: 09:56, 27.06.2005

Re: Подскажите!

Сообщение Maxim Mirgorodsky »

iReadOffset := 1;

Изначально он должен быть равен 0. В этом и ошибка. Состояние пустое, а значит блок данных содержит всего 4 байта, а Вы читаете со второго по пятый.
Treibl
Сообщения: 29
Зарегистрирован: 09:24, 21.09.2011

Re: Подскажите!

Сообщение Treibl »

Се равно ситуация этаже!!!
Аватара пользователя
SV
Сообщения: 797
Зарегистрирован: 00:11, 06.09.2010
Откуда: Киров

Re: Подскажите!

Сообщение SV »

var
count:WideString;
begin
iSize := CommFortGetData(13, nil, 0, nil, 0);
SetLength(aData, iSize);
CommFortGetData(13, PAnsiChar(aData), iSize, nil, 0);
iReadOffset := 0;
count := fReadText(PAnsiChar(aData), iReadOffset);
end;

Попробуй так.
Ты за место текстовых данных обрабатывал числовые;

ID: 13
Блок данных (исходящий): [нулевое значение]
Блок данных (входящий): текст(текущее состояние)
Treibl
Сообщения: 29
Зарегистрирован: 09:24, 21.09.2011

Re: Подскажите!

Сообщение Treibl »

Опять вылетел я не пойму в чём ошибка! Плагин работает но когда добавляешь эти строки комфорт вылетает! Может быть надо ещё что то добавить? И ещё неважно в какой процидури я их пишу???
Последний раз редактировалось Treibl 13:39, 15.11.2011, всего редактировалось 1 раз.
Treibl
Сообщения: 29
Зарегистрирован: 09:24, 21.09.2011

Re: Подскажите!

Сообщение Treibl »

Вот весь мой код!

unit main;

interface

uses
Windows, Classes, SysUtils, Dialogs, ExtCtrls, Messages, Variants, Graphics, Controls;
type
TCommFortProcess = procedure(dwPluginID : DWORD; dID: DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD); stdcall;
TCommFortGetData = function(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD; stdcall;

function PluginStart(dwThisPluginID : DWORD; func1 : TCommFortProcess; func2 : TCommFortGetData) : Integer; cdecl; stdcall;
procedure PluginStop(); cdecl; stdcall;
procedure PluginShowOptions(); cdecl; stdcall;
procedure PluginShowAbout(); cdecl; stdcall;
procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD); cdecl; stdcall;
function PluginGetData(dwID : DWORD; bInBuffer : PAnsiChar;
dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD; cdecl; stdcall;
function PluginPremoderation(dwID : DWORD; wText : PWideChar; var dwTextLength : DWORD): Integer; cdecl; stdcall;

function fReadInteger(bInBuffer : PAnsiChar; var iOffset : Integer): Integer;
function fReadText(bInBuffer : PAnsiChar; var iOffset : Integer): WideString;
procedure fWriteInteger(var bOutBuffer : PAnsiChar; var iOffset : Integer; iValue : Integer);
procedure fWriteText(bOutBuffer : PAnsiChar; var iOffset : Integer; uValue : WideString);
function fTextToAnsiString(uText : WideString) : AnsiString;
function fIntegerToAnsiString(iValue : Integer) : AnsiString;



exports PluginStart, PluginStop, PluginProcess, PluginGetData, PluginShowOptions, PluginShowAbout, PluginPremoderation;

implementation

var
dwPluginID : DWORD;
CommFortProcess : TCommFortProcess;
CommFortGetData : TCommFortGetData;


//---------------------------------------------------------------------------
function fReadInteger(bInBuffer : PAnsiChar; var iOffset : Integer): Integer; //вспомогательная функция для упрощения работы с чтением данных
begin
CopyMemory(@Result, bInBuffer + iOffSet, 4);
iOffset := iOffset + 4;
end;

function fReadText(bInBuffer : PAnsiChar; var iOffset : Integer): WideString; //вспомогательная функция для упрощения работы с чтением данных
var iLength : Integer;
begin
CopyMemory(@iLength, bInBuffer + iOffSet, 4);
iOffset := iOffset + 4;
SetLength(Result, iLength);
CopyMemory(@Result[1], bInBuffer + iOffSet, iLength * 2);
iOffset := iOffset + iLength * 2;
end;

//---------------------------------------------------------------------------
procedure fWriteInteger(var bOutBuffer : PAnsiChar; var iOffset : Integer; iValue : Integer); //вспомогательная функция для упрощения работы с записью данных
begin
CopyMemory(bOutBuffer + iOffSet, @iValue, 4);
iOffset := iOffset + 4;
end;
//---------------------------------------------------------------------------
procedure fWriteText(bOutBuffer : PAnsiChar; var iOffset : Integer; uValue : WideString); //вспомогательная функция для упрощения работы с записью данных
var iLength : Integer;
begin
iLength := Length(uValue);
CopyMemory(bOutBuffer + iOffset, @iLength, 4);
iOffset := iOffset + 4;

CopyMemory(bOutBuffer + iOffSet, @uValue[1], iLength * 2);
iOffset := iOffset + iLength * 2;
end;

//---------------------------------------------------------------------------
function fTextToAnsiString(uText : WideString) : AnsiString; //вспомогательная функция для упрощения работы с данными
var iLength : Integer;
begin
//функция предназначена для ознакомительных целей,
//не рекомендуется для реального применения,
//так как при ее использовании проявляется избыточное копирование данных
iLength := Length(uText);

SetLength(Result, 4 + iLength * 2);

CopyMemory(@Result[1], @iLength, 4);
CopyMemory(PAnsiChar(Result) + 4, @uText[1], iLength * 2);
end;
//---------------------------------------------------------------------------
function fIntegerToAnsiString(iValue : Integer) : AnsiString; //вспомогательная функция для упрощения работы с данными
begin
//функция предназначена для ознакомительных целей,
//не рекомендуется для реального применения,
//так как при ее использовании проявляется избыточное копирование данных

SetLength(Result, 4);
CopyMemory(@Result[1], @iValue, 4);
end;
//---------------------------------------------------------------------------
function PluginStart(dwThisPluginID : DWORD; func1 : TCommFortProcess; func2 : TCommFortGetData) : Integer;
begin
dwPluginID := dwThisPluginID;
//При инициализации планину присваивается уникальный идентификатор
//его необходимо обязательно сохранить, и указывать
//в качестве первого параметра при инициировании событий
CommFortProcess := func1;
//указываем функцию обратного вызова,
//с помощью которой плагин сможет инициировать события

CommFortGetData := func2;
//указываем функцию обратного вызова,
//с помощью которой можно будет запрашивать необходимые данные от программы


//Возвращаемые значения:
//TRUE - запуск прошел успешно
//FALSE - запуск невозможен
Result := Integer(TRUE);

end;
//---------------------------------------------------------------------------
procedure PluginStop();
begin
//данная функция вызывается при завершении работы плагина


end;
//---------------------------------------------------------------------------


procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD);
var iReadOffset, iSize : Integer;
aData : AnsiString;
count : WideString;


//Функция приема событий
//Параметры:
//dwID - идентификатор события
//bInBuffer - указатель на данные
//dwInBufferSize - объем данных в байтах


begin

iSize := CommFortGetData(13, nil, 0, nil, 0);
SetLength(aData, iSize);
CommFortGetData(13, PAnsiChar(aData), iSize, nil, 0);
iReadOffset := 0;
count := fReadText(PAnsiChar(aData), iReadOffset);

end;

//---------------------------------------------------------------------------
function PluginGetData(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD;
var iWriteOffset, iSize : Integer; //вспомогательные переменные для упрощения работы с блоком данных
uName : WideString;
begin

//функция передачи данных программе
iWriteOffset := 0;

//при значении dwOutBufferSize равным нулю функция должна вернуть объем данных, ничего не записывая

if (dwID = 2800) then //предназначение плагина
begin
if (dwOutBufferSize = 0) then
Result := 4 //объем памяти в байтах, которую необходимо выделить программе
else
begin
fWriteInteger(bOutBuffer, iWriteOffset, 2); //плагин подходит только для клиента
Result := 4;//объем заполненного буфера в байтах
end;
end
else
if (dwID = 2810) then //название плагина (отображается в списке)
begin
uName := 'Plugint';//название плагина
iSize := Length(uName) * 2 + 4;

if (dwOutBufferSize = 0) then
Result := iSize //объем памяти в байтах, которую необходимо выделить программе
else
begin
fWriteText(bOutBuffer, iWriteOffset, uName);
Result := iSize;//объем заполненного буфера в байтах
end;
end
else
Result := 0;//возвращаемое значение - объем записанных данных
end;
//---------------------------------------------------------------------------
function PluginPremoderation(dwID : DWORD; wText : PWideChar; var dwTextLength : DWORD): Integer;
var uCheck, uRet : WideString;
begin
//функция пермодерации
//если Ваш плагин не использует премодерацию, рекомендуем исключить функцию из исходного кода, это сэкономит вычислительные ресурсы

//Важно! Буфер выделяется на 40000 символов. Нельзя вносить в него данные бОльшего объема.
if (dwID = 0) then// обычный текст в общий канал
begin
uCheck := 'проверка премодерации текста в канале';

//если Delphi 2009 и выше то заменить строчку ниже на эту //if ( StrComp(wText, PWideChar(uCheck)) = 0) then
if ( StrComp(PAnsiChar(wText), PAnsiChar(uCheck)) = 0) then
begin
uRet := 'проверка премодерации текста в канале: успешно';
CopyMemory(wText, @uRet[1], Length(uRet) * 2);
dwTextLength := Length(uRet);//корректируем количество символов
Result := Integer(TRUE);//TRUE означает что буфер был модифицирован
end
else
Result := Integer(FALSE);
end
else
Result := Integer(FALSE);//важно вернуть FALSE в случае если буфер не был модифицирован
end;
//---------------------------------------------------------------------------
procedure PluginShowOptions(); //Вызывается при нажатии на кнопку "Настройка"

begin

end;



//---------------------------------------------------------------------------
procedure PluginShowAbout();
begin
//данная функция вызывается при нажатии кнопки "О плагине" в списке плагинов


end;

end.


end.
Аватара пользователя
SV
Сообщения: 797
Зарегистрирован: 00:11, 06.09.2010
Откуда: Киров

Re: Подскажите!

Сообщение SV »

Как я понимаю ты пишешь для клиента плагин? После какого события тебе нужно запрашивать статус?
Treibl
Сообщения: 29
Зарегистрирован: 09:24, 21.09.2011

Re: Подскажите!

Сообщение Treibl »

Да для клиента! Но скачало я должен получить состояние а потом произойдет действие! После которого понадобится состояние!
Моя версия комфорта 5.30
Maxim Mirgorodsky
Администратор
Сообщения: 6867
Зарегистрирован: 09:56, 27.06.2005

Re: Подскажите!

Сообщение Maxim Mirgorodsky »

Попробуйте принимать и инициировать события. Если будет коррректно работать, попробуйте получить другие данные от программы. Сложностей с определением ошибок, которые проявляются так явно быть не должно.
Treibl
Сообщения: 29
Зарегистрирован: 09:24, 21.09.2011

Re: Подскажите!

Сообщение Treibl »

Проблема разрешилась сам не пойму как!)
Аватара пользователя
Jenya-Grin
Сообщения: 356
Зарегистрирован: 20:30, 22.09.2011
Откуда: Украина, г.Бердичев

Re: Подскажите!

Сообщение Jenya-Grin »

Treibl писал(а):Проблема разрешилась сам не пойму как!)
Такое у меня частенько бывало ранее :mrgreen: :mrgreen: :mrgreen:
Ответить