Технология создания плагинов и программ-дополнений
-
- Администратор
- Сообщения: 6869
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов и программ-дополнений
Сетевой протокол CommFort и система плагинов не связаны друг с другом.
Re: Технология создания плагинов и программ-дополнений
Как вообще писать плагины? С помощью каких программ?
-
- Администратор
- Сообщения: 6869
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов и программ-дополнений
Плагины - это динамически загружаемые библиотеки (DLL). В Интернете есть много информации по ним. Например: http://ru.wikipedia.org/wiki/DLL
Документация по commfort.
Доброе время суток, вообщем у меня есть несколько вопросов:
1)Почему документация по commfort а именно написания дополнений так мало. Я вот например скачал линки по докум.запросов но для версии 4.2 не действует, думаю многие бы хотели дополнить commfort но от того что так мало документации по написанию и в том числе экспортируемых фунций мало?
2)Где мне можно найти примеры команд по commfort и могу ли я стандартным путем отрпавить запрос UPDCLIENT1.SENBUF(S,i); ? при s указатель на буфер i Длина строки, почему таким же путем основываясь на мануалах например той же документации я немогу построить пакет сам а именно запросить список юзеров? send(60)? при 60 запрос на список юзеров.
Вообщем напишите нормальную документацию по запросам и какие библиотки нужны неужели чтобы отрпавить запрос надо писать всякие дополнения типо оболочек? я не новичок в прог но мне лично вот сложно по этих мануалах делать...заранее спс за ответы.
1)Почему документация по commfort а именно написания дополнений так мало. Я вот например скачал линки по докум.запросов но для версии 4.2 не действует, думаю многие бы хотели дополнить commfort но от того что так мало документации по написанию и в том числе экспортируемых фунций мало?
2)Где мне можно найти примеры команд по commfort и могу ли я стандартным путем отрпавить запрос UPDCLIENT1.SENBUF(S,i); ? при s указатель на буфер i Длина строки, почему таким же путем основываясь на мануалах например той же документации я немогу построить пакет сам а именно запросить список юзеров? send(60)? при 60 запрос на список юзеров.
Вообщем напишите нормальную документацию по запросам и какие библиотки нужны неужели чтобы отрпавить запрос надо писать всякие дополнения типо оболочек? я не новичок в прог но мне лично вот сложно по этих мануалах делать...заранее спс за ответы.
-
- Администратор
- Сообщения: 6869
- Зарегистрирован: 09:56, 27.06.2005
Re: Технология создания плагинов и программ-дополнений
http://www.commfort.com/ru/forum/viewto ... 117#p311171)Почему документация по commfort а именно написания дополнений так мало.
Все остальные вопросы понять не удалось. Пожалуйста, объясните более понятно.Maxim Mirgorodsky писал(а):Плагины до сих пор работали в тестовом режиме. К выпуску следующей версии справочная информация по плагинам будет модернизирована.
Re: Технология создания плагинов и программ-дополнений
Доброго времени суток. А подскажите пожалуйста способ попроще для определения местонахождения плагина на диске. Чтобы настройки плагина хранить рядом в папочке.
PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.
PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.
Re: Технология создания плагинов и программ-дополнений
Код: Выделить всё
procedure plugname;
var
plug_name: array[0..500] of char;
begin
getmodulefilename(NULL, plug_name, 500);
showmessage(plug_name);
end;
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Re: Технология создания плагинов и программ-дополнений
А разве процедуре getmodulefilename нужен char а не указатель на char?VIRUS писал(а):Может быть так.Код: Выделить всё
procedure plugname; var plug_name: array[0..500] of char; begin getmodulefilename(NULL, plug_name, 500); showmessage(plug_name); end;
Хотя.... что-то совсем забыл как в дельфях указатели используются)))
Спасибо. Адрес commfort.exe получили, дальше доберусь. В С++ сей код будет выглядеть так
Код: Выделить всё
char buffer[500];
GetModuleFileNameA(NULL,&buffer,500);
ShowMessage(buffer);
Re: Технология создания плагинов и программ-дополнений
Лучше файлы настройки плагинов хранить в той же папке где настройки хранит сам коммфорт. Это позволит избежать проблем с доступом в Vista и Win7 так как если комфорт установлен в Program Files и запущен не с правами администратора, то он просто не сможет в той папке ничего записать.Slayter писал(а):Доброго времени суток. А подскажите пожалуйста способ попроще для определения местонахождения плагина на диске. Чтобы настройки плагина хранить рядом в папочке.
PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.
Вот моя функция определения директории 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: Технология создания плагинов и программ-дополнений
Когда мы передаем в функцию массив, мы и передаем адрес на первый элемент этого массива. Я думаю, что в этом коде правильнее будет такА разве процедуре getmodulefilename нужен char а не указатель на char?
Код: Выделить всё
void Name()
{
char buffer[500];
GetModuleFileNameA(nil,buffer,500);
ShowMessage(buffer);
}
Последний раз редактировалось VIRUS 22:29, 10.11.2009, всего редактировалось 5 раз.
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Re: Технология создания плагинов и программ-дополнений
Не путайте народ. Я всё правильно написал. В С++ ПРи GetModuleFileNameA(nil,buffer,500); он передает не указатель на массив а первый элемент массива. Так что я правильно написал)VIRUS писал(а):А разве процедуре getmodulefilename нужен char а не указатель на char?Код: Выделить всё
char buffer[500]; GetModuleFileNameA(nil,buffer,500); ShowMessage(buffer);
А не могли бы Вы сказать в каком юните в Дельфи (или что у Вас там) описан заголовок сей функции... А то никак не могу ей воспользовать - кучка ошибок "Multiple Declarations of "..." " Вылезает. Никак что-то разобраться не могу)-=SJ=- писал(а): Вот моя функция определения директории Config в папке с настройками чата:Код: Выделить всё
.... SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path[0]) ; ...
Re: Технология создания плагинов и программ-дополнений
А точнее адрес первого элемента. Тогда будет правильно так GetModuleFileNameA(nil,&buffer[0],500);Не путайте народ. Я всё правильно написал. В С++ ПРи GetModuleFileNameA(nil,buffer,500); он передает не указатель на массив а первый элемент массива. Так что я правильно написал)
В функцию GetModuleFileNameA передается адрес массива, эта функция имеет следующее объявление
Код: Выделить всё
DWORD WINAPI GetModuleFileName(
__in_opt HMODULE hModule,
[b]__out LPTSTR lpFilename,[/b]
__in DWORD nSize
);
По поводу функции SHGetFolderPath. За Delphi не знаю, но в VС++ она по моему в этом заглавном файле находится shlobj.h
Пользователь думает, что в килобайте 1000 байт, а программист думает, что в километре 1024 метра.
Re: Технология создания плагинов и программ-дополнений
Да, в BC++Builder этот shlobj.h тоже имеется, но нормально подключить его что-то не удается. См приложение.VIRUS писал(а): По поводу функции SHGetFolderPath. За Delphi не знаю, но в VС++ она по моему в этом заголовочном файле находится 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 скачивания
Re: Технология создания плагинов и программ-дополнений
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: Технология создания плагинов и программ-дополнений
Спасибо, помогло))))-=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);
};