Просмотр полной версии : WinAPI в Delphi
В общем, не догоняю, как объявить API-функцию.
Из гугла/яндекса толкового почти ничего не выжал. только примерно вот это (и то не работает)
function GetWindowDC(Wnd: HWnd): hDC;
stdcall; extenal 'user32.dll' name 'GetWindowDC';
Всяко экспериментировал, но нирвзу не заработало. Честно говоря, я ваще толком не знаю, куда это писать... Объясните дураку...
И ещё пытался с реестром бодаться (Там функции в 'Windows' объявлены). Тоже не вышло ничего, хотя в ВБ те же функции спокойно юзаю...
пока на нее не подсел переходи на цпп)
пока на нее не подсел переходи на цпп)
не подсяду) просто всё по порядку :)
uses Windows
Эта функция там описана
uses Windows
Эта функция там описана
Мне не конкретно эту функцию надо.
Млин, вся опа в том, что вопрос простейший, а ответа нет. Просто дельфин не родной для мну язык, вот и парюсь :)
Вроде в первом посту функция выглядит правильно. Может только в одну строку ее записать. А что конкретно не работает?
transserg
19.02.2010, 17:54
DiffiT
unit ....;
uses
windows;
.......
function GetWindowDC(Wnd: HWnd): hDC;
stdcall; extenal 'user32.dll' name 'GetWindowDC';
function GetModuleFileNameEx(hProcess: THandle; hModule: HINST;
lpFilename: PChar; nSize: DWORD): DWORD; stdcall; external 'psapi.dll'
name 'GetModuleFileNameExA';
function EnumProcessModules(hProcess: THandle; lphModule: LPDWORD; cb: DWORD;
Var lpcbNeeded: DWORD): BOOL Stdcall; external 'psapi.dll'
name 'EnumProcessModules';
implementation
....
end.
в модуле должно выглядеть примерно так
если ты объявляешь функцию так же как она в библиотеке названа то имя
name 'GetModuleFileNameExA';
можно не писать..
DiffiT
unit ....;
uses
windows;
.......
function GetWindowDC(Wnd: HWnd): hDC;
stdcall; extenal 'user32.dll' name 'GetWindowDC';
function GetModuleFileNameEx(hProcess: THandle; hModule: HINST;
lpFilename: PChar; nSize: DWORD): DWORD; stdcall; external 'psapi.dll'
name 'GetModuleFileNameExA';
function EnumProcessModules(hProcess: THandle; lphModule: LPDWORD; cb: DWORD;
Var lpcbNeeded: DWORD): BOOL Stdcall; external 'psapi.dll'
name 'EnumProcessModules';
implementation
....
end.
в модуле должно выглядеть примерно так
если ты объявляешь функцию так же как она в библиотеке названа то имя
name 'GetModuleFileNameExA';
можно не писать..
вроде, так и делаю.. =) щас ещё раз попробую :)
;) спасибо, заработало)))) не туда писал, как оказалось)))) Пробовал писать в type, как функцию формы, пробовал в public и в private :) щас вкурил, зачем там end был))))
а по поводу реестра, у кого-нить есть рабочий исходник? А то я офигеваю с типов PAnsiChar и Cardinal :D
Всё никак с параметрами угадать не могу))))
transserg
19.02.2010, 18:28
DiffiT что именно хочешь с реестром делать. пример чтения и поиска есть... записать написать не сложно
transserg
19.02.2010, 18:49
Procedure ScanRegistry(RootKey:HKEY;SubKey:String);
var
hSubKey:HKEY;
NumKey,NumValue:DWORD;
NameKey:Pointer;
NameValue:Pointer;
BufSize:DWORD;
KeyError,ValueError:integer;
begin
NumKey:=0;
NumValue:=0;
BufSize:=2048;
if ThreadExit then
exit;
GetMem(NameValue,BufSize);
GetMem(NameKey,BufSize);
try
if RegOpenKeyEx(RootKey, PChar(SubKey),0,KEY_ALL_ACCESS,hSubKey)=ERROR_SUCC ESS then
begin
ValueError:=RegEnumValue(hSubKey,NumValue,NameValu e,BufSize, nil, nil, nil, nil);
if PChar(NameValue)<>'' then
begin
ResultAnalize(RootKey,PChar(SubKey),NameValue);
end;
inc(NumValue);
while ValueError=ERROR_SUCCESS do
begin
BufSize:=2048;
try
ValueError:=RegEnumValue(hSubKey,NumValue,NameValu e,BufSize, nil, nil, nil, nil);
if ValueError=ERROR_SUCCESS then
if PChar(NameValue)<>'' then
begin
ResultAnalize(RootKey,PChar(SubKey),NameValue);
inc(TotalValue);
end;
finally
inc(NumValue);
end;
end;
Sleep(2);
KeyError:=ERROR_SUCCESS;
while KeyError=ERROR_SUCCESS do
begin
BufSize:=2024;
KeyError:=RegEnumKeyEx(hSubKey,NumKey,NameKey,BufS ize,nil,nil,nil,nil);
inc(TotalKeys);
if KeyError=ERROR_SUCCESS then
if SubKey='' then
ScanRegistry(RootKey,PChar(Concat(SubKey,PChar(Nam eKey))))
else
ScanRegistry(RootKey,PChar(Concat(SubKey,'\',PChar (NameKey))));
inc(NumKey);
end;
end;
finally
FreeMem(NameKey);
FreeMem(NameValue);
RegCloseKey(hSubKey);
end;
end;
процедура обхода дерева реестра
первый параметр подраздел один из
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_PERFORMANCE_DATA
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
второй параметр это ключ с которого начнется перебор если пустой то будет перебирать с корня под раздела
ResultAnalize(RootKey,PChar(SubKey),NameValue);
процедура анализа в которой ты собственно и удовлетворяют ли считанные данные условию поиска
transserg
19.02.2010, 18:53
вот часть кода на чтение значения
var
hSubKey : HKEY;
MyValType : DWORD;
BufSize : DWORD;
Buf: Pointer;
.....
if RegOpenKey(RootKey, SubKey,hSubKey) = ERROR_SUCCESS then
try
if RegQueryValueEx(hSubKey, ValueName, nil, @MyValType, nil, @BufSize) =ERROR_SUCCESS then
begin
GetMem(Buf, BufSize);
try
if RegQueryValueEx(hSubKey, ValueName, nil, @MyValType, Buf, @BufSize) =ERROR_SUCCESS then
begin
end;
......
SubKey "путь" до ключа в реестре
ValueName имя параметра
Buf указатель на значение параметра
DiffiT что именно хочешь с реестром делать. пример чтения и поиска есть... записать написать не сложно
мне простейщие операции чтение\запись))) функции уже до меня объявлены, а с параметрами борода :)
transserg
19.02.2010, 18:55
DiffiT стукни в асю =)
RegQueryValueEx(hSubKey, ValueName, nil, @MyValType, nil, @BufSize)
вот в этих сцабаках наверное и есть проблема :)
transserg
19.02.2010, 19:12
hSubKey: HKEY;
ValueName:Pchar;
MyValType:DWORD;
BufSize:DWORD;
пока на нее не подсел переходи на цпп)
Сорри за оффтоп, но почему дельфи так не любят? Что в ней нет, что есть в cpp? :confused:
Сорри за оффтоп, но почему дельфи так не любят? Что в ней нет, что есть в cpp? :confused:
Мдя уж...
Мдя уж...
Опять офф топ....
Но ответ "мдя уж" в данной ситуации мало уместен..
Будьте добры пояснить свою точку зрения.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot