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

Здесь обсуждаются графические оболочки, боты, языковые файлы и другие дополнения к CommFort 4.
Maxim Mirgorodsky
Администратор
Сообщения: 6869
Зарегистрирован: 09:56, 27.06.2005

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

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

Сетевой протокол CommFort и система плагинов не связаны друг с другом.
XSlashX
Сообщения: 102
Зарегистрирован: 16:17, 26.04.2009

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

Сообщение XSlashX »

Как вообще писать плагины? С помощью каких программ?
Maxim Mirgorodsky
Администратор
Сообщения: 6869
Зарегистрирован: 09:56, 27.06.2005

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

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

Плагины - это динамически загружаемые библиотеки (DLL). В Интернете есть много информации по ним. Например: http://ru.wikipedia.org/wiki/DLL
comf
Сообщения: 1
Зарегистрирован: 21:40, 31.10.2009

Документация по commfort.

Сообщение comf »

Доброе время суток, вообщем у меня есть несколько вопросов:
1)Почему документация по commfort а именно написания дополнений так мало. Я вот например скачал линки по докум.запросов но для версии 4.2 не действует, думаю многие бы хотели дополнить commfort но от того что так мало документации по написанию и в том числе экспортируемых фунций мало?
2)Где мне можно найти примеры команд по commfort и могу ли я стандартным путем отрпавить запрос UPDCLIENT1.SENBUF(S,i); ? при s указатель на буфер i Длина строки, почему таким же путем основываясь на мануалах например той же документации я немогу построить пакет сам а именно запросить список юзеров? send(60)? при 60 запрос на список юзеров.
Вообщем напишите нормальную документацию по запросам и какие библиотки нужны неужели чтобы отрпавить запрос надо писать всякие дополнения типо оболочек? я не новичок в прог но мне лично вот сложно по этих мануалах делать...заранее спс за ответы. :x
Maxim Mirgorodsky
Администратор
Сообщения: 6869
Зарегистрирован: 09:56, 27.06.2005

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

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

1)Почему документация по commfort а именно написания дополнений так мало.
http://www.commfort.com/ru/forum/viewto ... 117#p31117
Maxim Mirgorodsky писал(а):Плагины до сих пор работали в тестовом режиме. К выпуску следующей версии справочная информация по плагинам будет модернизирована.
Все остальные вопросы понять не удалось. Пожалуйста, объясните более понятно.
Slayter
Сообщения: 13
Зарегистрирован: 00:05, 09.11.2009

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

Сообщение Slayter »

Доброго времени суток. А подскажите пожалуйста способ попроще для определения местонахождения плагина на диске. Чтобы настройки плагина хранить рядом в папочке. :wink:

PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

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

Сообщение VIRUS »

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

procedure plugname;
var
plug_name: array[0..500] of char;
begin
getmodulefilename(NULL, plug_name, 500);
showmessage(plug_name);
end;
Может быть так.
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Slayter
Сообщения: 13
Зарегистрирован: 00:05, 09.11.2009

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

Сообщение Slayter »

VIRUS писал(а):

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

procedure plugname;
var
plug_name: array[0..500] of char;
begin
getmodulefilename(NULL, plug_name, 500);
showmessage(plug_name);
end;
Может быть так.
А разве процедуре getmodulefilename нужен char а не указатель на char?
Хотя.... что-то совсем забыл как в дельфях указатели используются)))
Спасибо. Адрес commfort.exe получили, дальше доберусь. В С++ сей код будет выглядеть так

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

   char buffer[500];
   GetModuleFileNameA(NULL,&buffer,500);
   ShowMessage(buffer);
Вдруг кому понадобится
Аватара пользователя
-=SJ=-
Сообщения: 246
Зарегистрирован: 02:21, 06.04.2007

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

Сообщение -=SJ=- »

Slayter писал(а):Доброго времени суток. А подскажите пожалуйста способ попроще для определения местонахождения плагина на диске. Чтобы настройки плагина хранить рядом в папочке. :wink:
PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.
Лучше файлы настройки плагинов хранить в той же папке где настройки хранит сам коммфорт. Это позволит избежать проблем с доступом в Vista и Win7 так как если комфорт установлен в Program Files и запущен не с правами администратора, то он просто не сможет в той папке ничего записать.

Вот моя функция определения директории Config в папке с настройками чата:

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

function GetConfigDir : String;
var 
   i, j : integer;
   Str : String;
begin
  j := ParamCount;
  for i := 1 to j do
    begin
      if (Pos('-cfg_', ParamStr(i)) = 1) and (Length(ParamStr(i)) > 5) then
        break;
    end;
  if i < j + 1 then
    begin
      Str := ParamStr(i);
      Delete(Str, 1, 5);
      Result := ExtractFilePath(ParamStr(0)) + 'AppData_' + Str + '\Config\';
    end
  else
    Result := AppDataPath + '\CommFort\Config\';
end;

function AppDataPath : string;
const
   SHGFP_TYPE_CURRENT = 0;
var
   path: array [0..MAX_PATH] of char;
begin
   SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path[0]) ;
   Result := path;
end;
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

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

Сообщение VIRUS »

А разве процедуре getmodulefilename нужен char а не указатель на char?
Когда мы передаем в функцию массив, мы и передаем адрес на первый элемент этого массива. Я думаю, что в этом коде правильнее будет так

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

   
void Name()
{
   char buffer[500];
   GetModuleFileNameA(nil,buffer,500);
   ShowMessage(buffer);
}
Так как имя массива это адрес первого элемента. Т.е. выражения &buffer[0] и buffer эквивалетны.
Последний раз редактировалось VIRUS 22:29, 10.11.2009, всего редактировалось 5 раз.
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Slayter
Сообщения: 13
Зарегистрирован: 00:05, 09.11.2009

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

Сообщение Slayter »

VIRUS писал(а):
А разве процедуре getmodulefilename нужен char а не указатель на char?

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

   char buffer[500];
   GetModuleFileNameA(nil,buffer,500);
   ShowMessage(buffer);
Не путайте народ. Я всё правильно написал. В С++ ПРи GetModuleFileNameA(nil,buffer,500); он передает не указатель на массив а первый элемент массива. Так что я правильно написал)
-=SJ=- писал(а): Вот моя функция определения директории Config в папке с настройками чата:

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

....
   SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path[0]) ;
...
А не могли бы Вы сказать в каком юните в Дельфи (или что у Вас там) описан заголовок сей функции... А то никак не могу ей воспользовать - кучка ошибок "Multiple Declarations of "..." " Вылезает. Никак что-то разобраться не могу)
Аватара пользователя
VIRUS
Сообщения: 174
Зарегистрирован: 13:15, 23.11.2008

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

Сообщение VIRUS »

Не путайте народ. Я всё правильно написал. В С++ ПРи GetModuleFileNameA(nil,buffer,500); он передает не указатель на массив а первый элемент массива. Так что я правильно написал)
А точнее адрес первого элемента. Тогда будет правильно так GetModuleFileNameA(nil,&buffer[0],500);

В функцию GetModuleFileNameA передается адрес массива, эта функция имеет следующее объявление

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

DWORD WINAPI GetModuleFileName(
  __in_opt  HMODULE hModule,
  [b]__out     LPTSTR lpFilename,[/b]
  __in      DWORD nSize
);
Т.е. как видно из листинга она принимает указатель на строку (массив восьмибитных символов) и работает уже с ним, а этот указатель в свою очередь уже указывает на первый элемент массива (точнее на его адрес).

По поводу функции SHGetFolderPath. За Delphi не знаю, но в VС++ она по моему в этом заглавном файле находится shlobj.h
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Slayter
Сообщения: 13
Зарегистрирован: 00:05, 09.11.2009

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

Сообщение Slayter »

VIRUS писал(а): По поводу функции SHGetFolderPath. За Delphi не знаю, но в VС++ она по моему в этом заголовочном файле находится shlobj.h
Да, в BC++Builder этот shlobj.h тоже имеется, но нормально подключить его что-то не удается. См приложение.

VIRUS писал(а): Т.е. как видно из листинга она принимает указатель на строку и работает уже с ним, а этот указатель в свою очередь уже указывает на первый элемент массива.
.... Упс...
Нашел ошибку) Но всё-равно, с неявными получениями адреса лучше не баловаться - баги возникают иногда такие что заними и 2 дня с отладчиком можно гоняться. Всё же форма GetModuleFileNameA(NULL,&buffer,500); более правильна - Берется именно адрес, который неявно потом приводится к (char *)

PS.
VIRUS писал(а): А точнее адрес первого элемента. Тогда будет правильно так GetModuleFileNameA(nil,&buffer[0],500);
В С++ эти записи совершенно идентичны по смыслу. В обоих случаях возвращается указатель на начало области паяти выделенной под переменную.

PPS. Так что там с SHGetFolderPath то?
Вложения
2009-11-10_213238.png
Ошибки при подключении shlobj.h
(7.5 КБ) 163 скачивания
Аватара пользователя
-=SJ=-
Сообщения: 246
Зарегистрирован: 02:21, 06.04.2007

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

Сообщение -=SJ=- »

Slayter писал(а):А не могли бы Вы сказать в каком юните в Дельфи (или что у Вас там) описан заголовок сей функции... А то никак не могу ей воспользовать - кучка ошибок "Multiple Declarations of "..." " Вылезает. Никак что-то разобраться не могу)

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

unit SHFolder;

interface

uses
  Windows;

{$HPPEMIT '#include <shfolder.h>'}

{
  functions to get shell special folders/
  shfolder.dll supports these on all platforms including Win95, Win98, NT4 and IE4 shell

  all CSIDL values refereed to here are supported natively by shfolder.dll, that is they
  will work on all platforms.
}
const
  CSIDL_PERSONAL = $0005; { My Documents }
{$EXTERNALSYM CSIDL_PERSONAL}
  CSIDL_APPDATA = $001A; { Application Data, new for NT4 }
{$EXTERNALSYM CSIDL_APPDATA}

  CSIDL_LOCAL_APPDATA = $001C; { non roaming, user\Local Settings\Application Data }
{$EXTERNALSYM CSIDL_LOCAL_APPDATA}
  CSIDL_INTERNET_CACHE = $0020;
{$EXTERNALSYM CSIDL_INTERNET_CACHE}
  CSIDL_COOKIES = $0021;
{$EXTERNALSYM CSIDL_COOKIES}
  CSIDL_HISTORY = $0022;
{$EXTERNALSYM CSIDL_HISTORY}
  CSIDL_COMMON_APPDATA = $0023; { All Users\Application Data }
{$EXTERNALSYM CSIDL_COMMON_APPDATA}
  CSIDL_WINDOWS = $0024; { GetWindowsDirectory() }
{$EXTERNALSYM CSIDL_WINDOWS}
  CSIDL_SYSTEM = $0025; { GetSystemDirectory() }
{$EXTERNALSYM CSIDL_SYSTEM}
  CSIDL_PROGRAM_FILES = $0026; { C:\Program Files }
{$EXTERNALSYM CSIDL_PROGRAM_FILES}
  CSIDL_MYPICTURES = $0027; { My Pictures, new for Win2K }
{$EXTERNALSYM CSIDL_MYPICTURES}
  CSIDL_PROGRAM_FILES_COMMON = $002b; { C:\Program Files\Common }
{$EXTERNALSYM CSIDL_PROGRAM_FILES_COMMON}
  CSIDL_COMMON_DOCUMENTS = $002e; { All Users\Documents }
{$EXTERNALSYM CSIDL_COMMON_DOCUMENTS}

  CSIDL_FLAG_CREATE = $8000; { new for Win2K, or this in to force creation of folder }
{$EXTERNALSYM CSIDL_FLAG_CREATE}

  CSIDL_COMMON_ADMINTOOLS = $002f; { All Users\Start Menu\Programs\Administrative Tools }
{$EXTERNALSYM CSIDL_COMMON_ADMINTOOLS}
  CSIDL_ADMINTOOLS = $0030; { <user name>\Start Menu\Programs\Administrative Tools }
{$EXTERNALSYM CSIDL_ADMINTOOLS}

  function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall;
  {$EXTERNALSYM SHGetFolderPath}
  function SHGetFolderPathA(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall;
  {$EXTERNALSYM SHGetFolderPathA}
  function SHGetFolderPathW(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall;
  {$EXTERNALSYM SHGetFolderPathW}

type
  PFNSHGETFOLDERPATHA = function(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall;
  {$EXTERNALSYM PFNSHGETFOLDERPATHA}
  PFNSHGETFOLDERPATHW = function(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall;
  {$EXTERNALSYM PFNSHGETFOLDERPATHW}
  PFNSHGETFOLDERPATH = PFNSHGETFOLDERPATHA;

  TSHGetFolderPathA = PFNSHGETFOLDERPATHA;
  TSHGetFolderPathW = PFNSHGETFOLDERPATHW;
  TSHGetFolderPath = TSHGetFolderPathA;

implementation

const
  SHFolderDll = 'SHFolder.dll';

function SHGetFolderPath; external SHFolderDll name 'SHGetFolderPathA';
function SHGetFolderPathA; external SHFolderDll name 'SHGetFolderPathA';
function SHGetFolderPathW; external SHFolderDll name 'SHGetFolderPathW';

end.
Slayter
Сообщения: 13
Зарегистрирован: 00:05, 09.11.2009

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

Сообщение Slayter »

-=SJ=- писал(а):

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

unit SHFolder;
interface
uses
  Windows;
{$HPPEMIT '#include <shfolder.h>'}
...............
Спасибо, помогло))))
Код получения папки с конфигами чата на Borland С++ :

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

#include <shfolder.h>
AnsiString GetConfigDir()
{
int i,j;
AnsiString Str;
j=ParamCount();
for (i=1;i<=j;i++)
   if ((ParamStr(i).Pos("-cfg_")==1)&&(ParamStr(i).Length()>5))
      break;
if (i<=j)
{
   Str=ParamStr(i).Delete(1,5);
   Str=ExtractFilePath(ParamStr(0))+"AppData_"+Str+"\\Config\\";
   return Str;
}
Str = AppDataPath()+"\\CommFort\\Config";
return Str;
};

AnsiString AppDataPath()
{
const SHGFP_TYPE_CURRENT = 0;
char path[500];
SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, &path[0]);
return AnsiString(path);
};
Спасибо -=SJ=- за исходник на дельфи)
Закрыто