Re: Технология создания плагинов и программ-дополнений
Добавлено: 08:51, 18.09.2009
Сетевой протокол CommFort и система плагинов не связаны друг с другом.
форум поддержки
https://commfort.com/ru/forum/
http://www.commfort.com/ru/forum/viewto ... 117#p311171)Почему документация по commfort а именно написания дополнений так мало.
Все остальные вопросы понять не удалось. Пожалуйста, объясните более понятно.Maxim Mirgorodsky писал(а):Плагины до сих пор работали в тестовом режиме. К выпуску следующей версии справочная информация по плагинам будет модернизирована.
Код: Выделить всё
procedure plugname;
var
plug_name: array[0..500] of char;
begin
getmodulefilename(NULL, plug_name, 500);
showmessage(plug_name);
end;
А разве процедуре getmodulefilename нужен char а не указатель на char?VIRUS писал(а):Может быть так.Код: Выделить всё
procedure plugname; var plug_name: array[0..500] of char; begin getmodulefilename(NULL, plug_name, 500); showmessage(plug_name); end;
Код: Выделить всё
char buffer[500];
GetModuleFileNameA(NULL,&buffer,500);
ShowMessage(buffer);
Лучше файлы настройки плагинов хранить в той же папке где настройки хранит сам коммфорт. Это позволит избежать проблем с доступом в Vista и Win7 так как если комфорт установлен в Program Files и запущен не с правами администратора, то он просто не сможет в той папке ничего записать.Slayter писал(а):Доброго времени суток. А подскажите пожалуйста способ попроще для определения местонахождения плагина на диске. Чтобы настройки плагина хранить рядом в папочке.
PS. Ну или хотябы любую идею как определить путь до exe'шника комфорта, в котором запущен плагин.
Код: Выделить всё
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;
Когда мы передаем в функцию массив, мы и передаем адрес на первый элемент этого массива. Я думаю, что в этом коде правильнее будет такА разве процедуре getmodulefilename нужен char а не указатель на char?
Код: Выделить всё
void Name()
{
char buffer[500];
GetModuleFileNameA(nil,buffer,500);
ShowMessage(buffer);
}
Не путайте народ. Я всё правильно написал. В С++ ПРи 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]) ; ...
А точнее адрес первого элемента. Тогда будет правильно так GetModuleFileNameA(nil,&buffer[0],500);Не путайте народ. Я всё правильно написал. В С++ ПРи GetModuleFileNameA(nil,buffer,500); он передает не указатель на массив а первый элемент массива. Так что я правильно написал)
Код: Выделить всё
DWORD WINAPI GetModuleFileName(
__in_opt HMODULE hModule,
[b]__out LPTSTR lpFilename,[/b]
__in DWORD nSize
);
Да, в BC++Builder этот shlobj.h тоже имеется, но нормально подключить его что-то не удается. См приложение.VIRUS писал(а): По поводу функции SHGetFolderPath. За Delphi не знаю, но в VС++ она по моему в этом заголовочном файле находится shlobj.h
.... Упс...VIRUS писал(а): Т.е. как видно из листинга она принимает указатель на строку и работает уже с ним, а этот указатель в свою очередь уже указывает на первый элемент массива.
В С++ эти записи совершенно идентичны по смыслу. В обоих случаях возвращается указатель на начало области паяти выделенной под переменную.VIRUS писал(а): А точнее адрес первого элемента. Тогда будет правильно так GetModuleFileNameA(nil,&buffer[0],500);
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.
Спасибо, помогло))))-=SJ=- писал(а):Код: Выделить всё
unit SHFolder; interface uses Windows; {$HPPEMIT '#include <shfolder.h>'} ...............
Код: Выделить всё
#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);
};