Плагин для CommFort (Delphi)

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Плагин для CommFort (Delphi)

Сообщение Maximus » 18 июн 2011, 06:54

Пытаюсь сделать по примеру и откомпилировать в расширение .cfplug

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

procedure TForm1.Button1Click(Sender: TObject);
var
aDataToSend :AnsiString;
app:string;
begin
    App := ExtractFilePath(ParamStr(0));//Определяет путь до файла
    //Добовляем текст в приветствие канала
    aDataToSend := fTextToAnsiString('CommFort') + fTextToAnsiString(app+'1\Privetstvie.txt'); //Текст который нужно отправить.
    CommFortProcess(dwPluginID, 62, PAnsiChar(aDataToSend), Length(aDataToSend)); //Отправляем
end;
При компиляции возникают ошибки

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

[Error] Unit1.pas(33): Undeclared identifier: 'fTextToAnsiString'
[Error] Unit1.pas(33): Incompatible types: 'String' and 'Integer'
[Error] Unit1.pas(34): Undeclared identifier: 'CommFortProcess'
[Error] Unit1.pas(34): Undeclared identifier: 'dwPluginID'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Почти везде неизвестные идентификаторы и что с ними делать?

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 13:58

Объявить их или что наиболее вероятно - подключить нужный модуль, который вероятно должен быть на сайте CommFort. Дай ссылку на пример


Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 16:30

Плагинами для CommFort никогда не занимался, поэтому сам не могу понять в чём дело. Но все не найденные функции и переменные не являются стандартными и должны быть как-то объявлены. Или в том примере подразумевается что разработчики плагинов уже знают об этом из какого-то примера, или всё же нужен какой-то модуль.

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 16:39

Кажется я нашёл его. В какую папку его нужно скопировать?

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

unit main;

interface

uses Windows, Classes, SysUtils, Dialogs;

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, iSenderIcon, iMessageMode : Integer;
    aDataToSend : AnsiString;
    uSenderLogin, uSenderIP, uChannel, uText : WideString;

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

	if (dwID = 5) then //сообщение в общий канал
	begin
		//Получаем данные о событии
		uSenderLogin := fReadText(bInBuffer, iReadOffset);//имя отправителя
		uSenderIP := fReadText(bInBuffer, iReadOffset);//IP-адрес отправителя
		iSenderIcon := fReadInteger(bInBuffer, iReadOffset);//иконка отправителя
		uChannel := fReadText(bInBuffer, iReadOffset);//канал, в который было отправлено сообщение
		iMessageMode := fReadInteger(bInBuffer, iReadOffset);//тип сообщения
		uText := fReadText(bInBuffer, iReadOffset);//текст сообщения

		//отправляем личное сообщение
		aDataToSend := fTextToAnsiString(uSenderLogin)+  //имя пользователя
		 fIntegerToAnsiString(0)+  //тип важности
	  	 fTextToAnsiString(uText); //сообщение
  		 CommFortProcess(dwPluginID, 70, PAnsiChar(aDataToSend), Length(aDataToSend))
	end;
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 := 'Repeater (тестовый плагин)';//название плагина
		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
	ShowMessage('Options dialog');
end;

//---------------------------------------------------------------------------
procedure PluginShowAbout();
begin
	//данная функция вызывается при нажатии кнопки "О плагине" в списке плагинов
	ShowMessage('Плагин повторяет личным сообщением все сообщения в общем канале.'
	 + #13#10 + 'Created by CommFort software Ltd.'
	 + #13#10 + 'Converted to Delphi by -=SJ=-'
	);
end;

end.

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 16:45

Туда же где лежит тот файл (чтобы путь не прописывать) и добавь его в dpr-файл

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 16:54

Вот так?
main in 'main.pas'
---------------------------------
Если да, то тогда другие ошибки.

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

[Error] Unit1.pas(33): Undeclared identifier: 'fTextToAnsiString'
[Error] Unit1.pas(33): Incompatible types: 'String' and 'Integer'
[Error] Unit1.pas(34): Undeclared identifier: 'CommFortProcess'
[Error] Unit1.pas(34): Undeclared identifier: 'dwPluginID'
[Error] Unit1.pas(36): '.' expected but ';' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 17:13

В своём файле в раздел uses дописать main

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 17:45

Тогда вот так:

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

[Hint] main.pas(145): Value assigned to 'iMessageMode' never used
[Hint] main.pas(143): Value assigned to 'iSenderIcon' never used
[Warning] main.pas(206): Suspicious typecast of WideString to PAnsiChar
[Error] Unit1.pas(34): Undeclared identifier: 'CommFortProcess'
[Error] Unit1.pas(34): Undeclared identifier: 'dwPluginID'
[Error] Unit1.pas(36): '.' expected but ';' found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 17:58

Из всего этого критично только:

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

[Error] Unit1.pas(36): '.' expected but ';' found
В Unit1.pas в конце вместо точки стоит ";". Или просто лишний ";"

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 18:03

Да действительно, лишний энд был. Тогда вот эти остались

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

[Error] Unit1.pas(34): Undeclared identifier: 'CommFortProcess'
[Error] Unit1.pas(34): Undeclared identifier: 'dwPluginID'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 18:32

Попробуй объявить там где переменные:

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

var
  dwPluginID : DWORD;
  CommFortProcess : TCommFortProcess;

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 19:02

Описывать нужно было в процедуре моей или как глобальные переменные? Если глобальными то

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

[Error] Project1.dpr(6): Declaration expected but identifier 'main' found

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 21:07

Как глобальные не надо

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 21:26

Если локальными, то ещё больше ошибок

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

[Warning] Unit1.pas(36): Variable 'dwPluginID' might not have been initialized
[Warning] Unit1.pas(36): Variable 'CommFortProcess' might not have been initialized
[Error] Project1.dpr(6): Declaration expected but identifier 'main' found

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 21:40

То что отмечено как [Warning] или [Hint] является предупреждением и не мешает компиляции. Ошибка не в этом. Покажи содержимое dpr-файла

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 21:46

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

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
  main in 'main.pas'

{$E cfplug}

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 18 июн 2011, 21:49

Замени

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

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
  main in 'main.pas'
на

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

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  main in 'main.pas';

Аватара пользователя
Maximus
Супермодератор
Супермодератор
Сообщения: 1507
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Maximus » 18 июн 2011, 22:21

Теперь вот это
Изображение

Аватара пользователя
Andrey
Администратор
Администратор
Сообщения: 2345
Зарегистрирован: 02 фев 2012, 11:42
Откуда: Воронеж
Контактная информация:

Re: Плагин для CommFort - "Изменение темы канала" (Delphi)

Сообщение Andrey » 19 июн 2011, 11:02

С расширением exe что-нибудь компилируется? А то опять ошибка как раньше.

Ответить