Recent

Author Topic: help to convert from delphi  (Read 8267 times)

iddv

  • New Member
  • *
  • Posts: 10
  • ..
help to convert from delphi
« on: May 05, 2016, 03:56:02 pm »
Please help to convert from delphi

Code: Pascal  [Select][+][-]
  1. unit main;
  2.  
  3. interface
  4.  
  5. uses Windows, Classes, SysUtils, Dialogs;
  6.  
  7. type
  8.   TCommFortProcess = procedure(dwPluginID : DWORD; dID: DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD); stdcall;
  9.   TCommFortGetData = function(dwPluginID : DWORD; dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD; stdcall;
  10.  
  11.  
  12. function  PluginStart(dwThisPluginID : DWORD; func1 : TCommFortProcess; func2 : TCommFortGetData) : Integer; cdecl; stdcall;
  13. procedure PluginStop(); cdecl; stdcall;
  14. procedure PluginShowOptions(); cdecl; stdcall;
  15. procedure PluginShowAbout(); cdecl; stdcall;
  16. procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD); cdecl; stdcall;
  17. function  PluginGetData(dwID : DWORD; bInBuffer : PAnsiChar;
  18.             dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD; cdecl; stdcall;
  19. function  PluginPremoderation(dwID : DWORD; wText : PWideChar; var dwTextLength : DWORD): Integer; cdecl; stdcall;
  20.  
  21. function  fReadInteger(bInBuffer : PAnsiChar; var iOffset : Integer): Integer;
  22. function  fReadText(bInBuffer : PAnsiChar; var iOffset : Integer): WideString;
  23. procedure fWriteInteger(var bOutBuffer : PAnsiChar; var iOffset  : Integer; iValue : Integer);
  24. procedure fWriteText(bOutBuffer : PAnsiChar; var iOffset  : Integer; uValue : WideString);
  25. function  fTextToAnsiString(uText : WideString) : AnsiString;
  26. function  fIntegerToAnsiString(iValue : Integer) : AnsiString;
  27.  
  28.  
  29.  
  30. exports PluginStart, PluginStop, PluginProcess, PluginGetData, PluginShowOptions, PluginShowAbout, PluginPremoderation;
  31.  
  32. implementation
  33.  
  34. var
  35.   dwPluginID : DWORD;
  36.   CommFortProcess : TCommFortProcess;
  37.   CommFortGetData : TCommFortGetData;
  38.  
  39. //---------------------------------------------------------------------------
  40. function fReadInteger(bInBuffer : PAnsiChar; var iOffset : Integer): Integer; //вспомогательная функция для упрощения работы с чтением данных
  41. begin
  42.         CopyMemory(@Result, bInBuffer + iOffSet, 4);
  43.         iOffset := iOffset + 4;
  44. end;
  45.  
  46. function fReadText(bInBuffer : PAnsiChar; var iOffset : Integer): WideString; //вспомогательная функция для упрощения работы с чтением данных
  47.  var iLength : Integer;
  48. begin
  49.         CopyMemory(@iLength, bInBuffer + iOffSet, 4);
  50.         iOffset := iOffset + 4;
  51.         SetLength(Result, iLength);
  52.         CopyMemory(@Result[1], bInBuffer + iOffSet, iLength * 2);
  53.         iOffset := iOffset + iLength * 2;
  54. end;
  55.  
  56. //---------------------------------------------------------------------------
  57. procedure fWriteInteger(var bOutBuffer : PAnsiChar; var iOffset  : Integer; iValue : Integer); //вспомогательная функция для упрощения работы с записью данных
  58. begin
  59.         CopyMemory(bOutBuffer + iOffSet, @iValue, 4);
  60.         iOffset := iOffset + 4;
  61. end;
  62. //---------------------------------------------------------------------------
  63. procedure fWriteText(bOutBuffer : PAnsiChar; var iOffset  : Integer; uValue : WideString); //вспомогательная функция для упрощения работы с записью данных
  64.         var iLength : Integer;
  65. begin
  66.         iLength := Length(uValue);
  67.         CopyMemory(bOutBuffer + iOffset, @iLength, 4);
  68.         iOffset := iOffset + 4;
  69.  
  70.         CopyMemory(bOutBuffer + iOffSet, @uValue[1], iLength * 2);
  71.         iOffset := iOffset + iLength * 2;
  72. end;
  73.  
  74. //---------------------------------------------------------------------------
  75. function fTextToAnsiString(uText : WideString) : AnsiString; //вспомогательная функция для упрощения работы с данными
  76.         var iLength : Integer;
  77. begin
  78.         //функция предназначена для ознакомительных целей,
  79.         //не рекомендуется для реального применения,
  80.         //так как при ее использовании проявляется избыточное копирование данных
  81.         iLength := Length(uText);
  82.  
  83.         SetLength(Result, 4 + iLength * 2);
  84.  
  85.         CopyMemory(@Result[1], @iLength, 4);
  86.         CopyMemory(PAnsiChar(Result) + 4, @uText[1], iLength * 2);
  87. end;
  88. //---------------------------------------------------------------------------
  89. function fIntegerToAnsiString(iValue : Integer) : AnsiString; //вспомогательная функция для упрощения работы с данными
  90. begin
  91.         //функция предназначена для ознакомительных целей,
  92.         //не рекомендуется для реального применения,
  93.         //так как при ее использовании проявляется избыточное копирование данных
  94.  
  95.         SetLength(Result, 4);
  96.         CopyMemory(@Result[1], @iValue, 4);
  97. end;
  98. //---------------------------------------------------------------------------
  99. function PluginStart(dwThisPluginID : DWORD; func1 : TCommFortProcess; func2 : TCommFortGetData) : Integer;
  100. var aDataToSend, aData : AnsiString;
  101.     iSize, iReadOffset : Integer;
  102.     uVersion : WideString;
  103. begin
  104.         dwPluginID := dwThisPluginID;
  105.         //При инициализации планину присваивается уникальный идентификатор
  106.         //его необходимо обязательно сохранить, и указывать
  107.         //в качестве первого параметра при инициировании событий
  108.         CommFortProcess := func1;
  109.         //указываем функцию обратного вызова,
  110.         //с помощью которой плагин сможет инициировать события
  111.  
  112.         CommFortGetData := func2;
  113.         //указываем функцию обратного вызова,
  114.         //с помощью которой можно будет запрашивать необходимые данные от программы
  115.  
  116.  
  117.         //создаем виртуального пользователя
  118.         aDataToSend := fTextToAnsiString('Repeater')+  //имя
  119.          fTextToAnsiString('192.168.0.0')+ //IP-адрес
  120.          fIntegerToAnsiString(0)+  //пароль в открытом виде
  121.          fTextToAnsiString('bkjxzbibe47bed8w7')+   //пароль
  122.          fIntegerToAnsiString(0); //иконка мужская
  123.  
  124.         CommFortProcess(dwPluginID, 1001, PAnsiChar(aDataToSend), Length(aDataToSend));
  125.  
  126.         //Пример получения данных от программы (получение версии программы):
  127.         iSize := CommFortGetData(dwPluginID, 2001, nil, 0, nil, 0); //получаем объем буфера
  128.         SetLength(aData, iSize);
  129.         CommFortGetData(dwPluginID, 2001, PAnsiChar(aData), iSize, nil, 0);//заполняем буфер
  130.         iReadOffset := 0;
  131.         uVersion := fReadText(PAnsiChar(aData), iReadOffset);
  132.         ShowMessage('Плагин успешно запущен на сервере CommFort версии - ' + uVersion);
  133.  
  134.  
  135.         //Возвращаемые значения:
  136.         //TRUE - запуск прошел успешно
  137.         //FALSE - запуск невозможен
  138.         Result := Integer(TRUE);
  139. end;
  140. //---------------------------------------------------------------------------
  141. procedure PluginStop();
  142. begin
  143.         //данная функция вызывается при завершении работы плагина
  144. end;
  145. //---------------------------------------------------------------------------
  146. procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD);
  147. var iReadOffset, iSenderIcon, iMessageMode : Integer;
  148.     aDataToSend : AnsiString;
  149.     uVirtualUserLogin, uSenderLogin, uSenderIP, uChannel, uText : WideString;
  150.  
  151. begin
  152.         //Функция приема событий
  153.         //Параметры:
  154.         //dwID - идентификатор события
  155.         //bInBuffer - указатель на данные
  156.         //dwInBufferSize - объем данных в байтах
  157.         iReadOffset := 0;
  158.  
  159.         if (dwID = 1070) then //сообщение в общий канал
  160.         begin
  161.                 //Получаем данные о событии
  162.                 uVirtualUserLogin := fReadText(bInBuffer, iReadOffset);
  163.                 uSenderLogin := fReadText(bInBuffer, iReadOffset);
  164.                 uSenderIP := fReadText(bInBuffer, iReadOffset);
  165.                 iSenderIcon := fReadInteger(bInBuffer, iReadOffset);
  166.                 uChannel := fReadText(bInBuffer, iReadOffset);
  167.                 iMessageMode := fReadInteger(bInBuffer, iReadOffset);
  168.                 uText := fReadText(bInBuffer, iReadOffset);
  169.  
  170.                 //отправляем личное сообщение
  171.                 aDataToSend := fTextToAnsiString('Repeater')+  //имя виртуального пользователя
  172.                  fIntegerToAnsiString(0)+  //тип важности
  173.                  fTextToAnsiString(uSenderLogin)+
  174.                  fTextToAnsiString(uText); //сообщение
  175.                  CommFortProcess(dwPluginID, 1022, PAnsiChar(aDataToSend), Length(aDataToSend))
  176.         end;
  177. end;
  178. //---------------------------------------------------------------------------
  179. function PluginGetData(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD;
  180. var iWriteOffset, iSize : Integer; //вспомогательные переменные для упрощения работы с блоком данных
  181.     uName : WideString;
  182. begin
  183.  
  184.       //функция передачи данных программе
  185.         iWriteOffset := 0;
  186.  
  187.         //при значении dwOutBufferSize равным нулю функция должна вернуть объем данных, ничего не записывая
  188.  
  189.         if (dwID = 2800) then //предназначение плагина
  190.         begin
  191.                 if (dwOutBufferSize = 0) then
  192.                         Result := 4 //объем памяти в байтах, которую необходимо выделить программе
  193.                 else
  194.                 begin
  195.                         fWriteInteger(bOutBuffer, iWriteOffset, 1); //плагин подходит только для сервера
  196.                         Result := 4;//объем заполненного буфера в байтах
  197.                 end;
  198.         end
  199.         else
  200.         if (dwID = 2810) then //название плагина (отображается в списке)
  201.         begin
  202.                 uName := 'Repeater (тестовый плагин)';//название плагина
  203.                 iSize := Length(uName) * 2 + 4;
  204.  
  205.                 if (dwOutBufferSize = 0) then
  206.                         Result := iSize //объем памяти в байтах, которую необходимо выделить программе
  207.                 else
  208.                 begin
  209.                         fWriteText(bOutBuffer, iWriteOffset, uName);
  210.                         Result := iSize;//объем заполненного буфера в байтах
  211.                 end;
  212.         end
  213.         else
  214.                 Result := 0;//возвращаемое значение - объем записанных данных
  215. end;
  216. //---------------------------------------------------------------------------
  217. function PluginPremoderation(dwID : DWORD; wText : PWideChar; var dwTextLength : DWORD):  Integer;
  218. var uCheck, uRet : WideString;
  219. begin
  220.         //функция пермодерации
  221.         //если Ваш плагин не использует премодерацию, рекомендуем исключить функцию из исходного кода, это сэкономит вычислительные ресурсы
  222.  
  223.         //Важно! Буфер выделяется на 40000 символов. Нельзя вносить в него данные бОльшего объема.
  224.         if (dwID = 1000) then// обычный текст в общий канал
  225.         begin
  226.                 uCheck := 'проверка премодерации текста в канале';
  227.  
  228.                 //если Delphi ниже 2009 то заменить строчку ниже на эту //if  ( StrComp(PAnsiChar(wText), PAnsiChar(uCheck)) = 0) then
  229.                 if ( StrComp(wText, PWideChar(uCheck)) = 0) then
  230.                 begin
  231.                         uRet := 'проверка премодерации текста в канале: успешно';
  232.                         CopyMemory(wText, @uRet[1], Length(uRet) * 2);
  233.                         dwTextLength := Length(uRet);//корректируем количество символов
  234.                         Result := Integer(TRUE);//TRUE означает что буфер был модифицирован
  235.                 end
  236.                 else
  237.                         Result := Integer(FALSE);
  238.         end
  239.         else
  240.                 Result := Integer(FALSE);//важно вернуть FALSE в случае если буфер не был модифицирован
  241. end;
  242. //---------------------------------------------------------------------------
  243. procedure PluginShowOptions();
  244. begin
  245.         ShowMessage('Options dialog');
  246. end;
  247.  
  248. //---------------------------------------------------------------------------
  249. procedure PluginShowAbout();
  250. begin
  251.         //данная функция вызывается при нажатии кнопки "О плагине" в списке плагинов
  252.         ShowMessage('Плагин повторяет личным сообщением все сообщения в общем канале.');
  253. end;
  254.  
  255. end.
The best is yet to come!..

balazsszekely

  • Guest
Re: help to convert from delphi
« Reply #1 on: May 05, 2016, 08:32:01 pm »
Lazarus Menu-->Tools-->Delphi conversion.  Please note, this will work only under windows. To make it cross platform, you need to do some extra work.

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #2 on: May 06, 2016, 04:16:56 pm »
Thanks. It is compiled without mistakes. But the program doesn't work.
In the attached file the full version of a code on Delphi.
The best is yet to come!..

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #3 on: May 07, 2016, 01:46:49 pm »
up.
The best is yet to come!..

balazsszekely

  • Guest
Re: help to convert from delphi
« Reply #4 on: May 07, 2016, 04:03:58 pm »
Quote
@iddv
Thanks. It is compiled without mistakes. But the program doesn't work.
Your project is a dll, so you have to load it from another application. What exactly does not work?  You need to be more specific.  What result are you expecting, and what result is actually produced instead?   

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #5 on: May 07, 2016, 04:51:11 pm »
It is a simple plug-in (example) for a chat of CommFort (www.commfort.com).
I have tried to collect everything in a small group. I have compiled in DLL. I copy in the folder where other plug-ins. But the program doesn't see this DLL.
The best is yet to come!..

rvk

  • Hero Member
  • *****
  • Posts: 6112
Re: help to convert from delphi
« Reply #6 on: May 07, 2016, 07:17:06 pm »
Well, I have zero knowledge about CommFort and can't read the foreign language the comments are in, but I think you need to rename the repeater.dll to repeater.cfcplug. CommFort doesn't "read" .dlls.

You might want to follow the instructions on this page:
http://devdelphi.ru/?p=3181

(for our English reader: https://translate.google.nl/translate?sl=ru&tl=en&hl=en&u=http%3A%2F%2Fdevdelphi.ru%2F%3Fp%3D3181)

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #7 on: May 08, 2016, 01:58:00 am »
I rename in cfplug. Not in it business.
I have written many plug-ins on Delphi.
I wanted to try on Lazarus.
please help to make a basis.
« Last Edit: May 08, 2016, 07:46:18 am by iddv »
The best is yet to come!..

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #8 on: May 08, 2016, 12:12:39 pm »
Here what at me has turned out. https://yadi.sk/d/e0oE827VrZQfx
It is compiled without mistakes.
But the CommFort program doesn't see this plug-in.
The knowing gurus I ask to help..



p/s/ sorry for my bad english
The best is yet to come!..

molly

  • Hero Member
  • *****
  • Posts: 2330
Re: help to convert from delphi
« Reply #9 on: May 08, 2016, 12:39:26 pm »
...., but I think you need to rename the repeater.dll to repeater.cfcplug. CommFort doesn't "read" .dlls.
I rename in cfplug. Not in it business.

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #10 on: May 08, 2016, 03:21:25 pm »
...., but I think you need to rename the repeater.dll to repeater.cfcplug. CommFort doesn't "read" .dlls.
I rename in cfplug. Not in it business.
yes. renamed to repeater.cfplug.
I explain that I have already written many plug-ins on Delphi.
I have incorrectly made something in converting of Delphi->Lazarus
The best is yet to come!..

rvk

  • Hero Member
  • *****
  • Posts: 6112
Re: help to convert from delphi
« Reply #11 on: May 08, 2016, 03:43:40 pm »
yes. renamed to repeater.cfplug.
You missed the point of molly's hint.

It's cfcplug as extension. NOT cfplug. (notice the extra c)
And since you typed it in two separate posts wrong, it's not that hard to imagine you also made the same mistake renaming the actual file.

Once you've confirmed that you indeed renamed it to repeater.cfcplug (with the extra c), we/you can look for other problems in your code.
« Last Edit: May 08, 2016, 03:45:39 pm by rvk »

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #12 on: May 08, 2016, 05:20:42 pm »
.cfcplug - in 4 version CommFort.
in 5 version - cfplug

error in code..
The best is yet to come!..

rvk

  • Hero Member
  • *****
  • Posts: 6112
Re: help to convert from delphi
« Reply #13 on: May 08, 2016, 08:55:54 pm »
Okay, I didn't know version 5 needed cfplug (and that you used version 5 which is also a important piece of information).

Next important piece of information is the version of your OS and Lazarus/FPC you used (and the bitness 32 of 64 bit)?? If you used the latest 1.6 download and have a 64bit OS, you probably downloaded the 64bit of Lazarus which produces 64bit .exe and .dll's. You can't use 64bit .exe/dll's in a 32bit program (and CommFort is probably 32 bit).

iddv

  • New Member
  • *
  • Posts: 10
  • ..
Re: help to convert from delphi
« Reply #14 on: May 09, 2016, 04:25:32 am »
And Tin then just opened! Thank you!
Installed the 32 bit version. The plugin has started.
Another question-instead of Russian language shows Abracadabra/

p.s. update.
added {$codepage utf8}. Now everything is normal-encoded
« Last Edit: May 09, 2016, 05:00:47 am by iddv »
The best is yet to come!..

 

TinyPortal © 2005-2018