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

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

Добавлено: 08:51, 18.09.2009
Maxim Mirgorodsky
Сетевой протокол CommFort и система плагинов не связаны друг с другом.

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

Добавлено: 20:31, 20.09.2009
XSlashX
Как вообще писать плагины? С помощью каких программ?

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

Добавлено: 06:09, 21.09.2009
Maxim Mirgorodsky
Плагины - это динамически загружаемые библиотеки (DLL). В Интернете есть много информации по ним. Например: http://ru.wikipedia.org/wiki/DLL

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

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

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

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

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

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

PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.

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

Добавлено: 13:10, 10.11.2009
VIRUS

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

procedure plugname;
var
plug_name: array[0..500] of char;
begin
getmodulefilename(NULL, plug_name, 500);
showmessage(plug_name);
end;
Может быть так.

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

Добавлено: 14:10, 10.11.2009
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);
Вдруг кому понадобится

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

Добавлено: 14:28, 10.11.2009
-=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;

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

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

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

   
void Name()
{
   char buffer[500];
   GetModuleFileNameA(nil,buffer,500);
   ShowMessage(buffer);
}
Так как имя массива это адрес первого элемента. Т.е. выражения &buffer[0] и buffer эквивалетны.

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

Добавлено: 21:19, 10.11.2009
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 "..." " Вылезает. Никак что-то разобраться не могу)

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

Добавлено: 22:16, 10.11.2009
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

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

Добавлено: 22:41, 10.11.2009
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 то?

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

Добавлено: 23:10, 10.11.2009
-=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.

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

Добавлено: 00:43, 13.11.2009
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=- за исходник на дельфи)