Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   WinAPI в Delphi (https://forum.antichat.xyz/showthread.php?t=180145)

DiffiT 19.02.2010 16:53

WinAPI в Delphi
 
В общем, не догоняю, как объявить API-функцию.

Из гугла/яндекса толкового почти ничего не выжал. только примерно вот это (и то не работает)
Код:

function GetWindowDC(Wnd: HWnd): hDC;
stdcall; extenal 'user32.dll' name 'GetWindowDC';

Всяко экспериментировал, но нирвзу не заработало. Честно говоря, я ваще толком не знаю, куда это писать... Объясните дураку...

И ещё пытался с реестром бодаться (Там функции в 'Windows' объявлены). Тоже не вышло ничего, хотя в ВБ те же функции спокойно юзаю...

sn0w 19.02.2010 17:13

пока на нее не подсел переходи на цпп)

DiffiT 19.02.2010 17:15

Цитата:

Сообщение от sn0w
пока на нее не подсел переходи на цпп)

не подсяду) просто всё по порядку :)

0rs 19.02.2010 17:43

uses Windows
Эта функция там описана

DiffiT 19.02.2010 17:45

Цитата:

Сообщение от 0rs
uses Windows
Эта функция там описана

Мне не конкретно эту функцию надо.

DiffiT 19.02.2010 17:47

Млин, вся опа в том, что вопрос простейший, а ответа нет. Просто дельфин не родной для мну язык, вот и парюсь :)

0rs 19.02.2010 17:53

Вроде в первом посту функция выглядит правильно. Может только в одну строку ее записать. А что конкретно не работает?

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 19.02.2010 18:11

Цитата:

Сообщение от transserg
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 19.02.2010 18:17

;) спасибо, заработало)))) не туда писал, как оказалось)))) Пробовал писать в type, как функцию формы, пробовал в public и в private :) щас вкурил, зачем там end был))))

DiffiT 19.02.2010 18:21

а по поводу реестра, у кого-нить есть рабочий исходник? А то я офигеваю с типов 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_SUCCESS then
        begin
          ValueError:=RegEnumValue(hSubKey,NumValue,NameValue,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,NameValue,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,BufSize,nil,nil,nil,nil);
              inc(TotalKeys);
              if KeyError=ERROR_SUCCESS then
                if SubKey='' then
                  ScanRegistry(RootKey,PChar(Concat(SubKey,PChar(NameKey))))
                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 19.02.2010 18:54

Цитата:

Сообщение от transserg
DiffiT что именно хочешь с реестром делать. пример чтения и поиска есть... записать написать не сложно

мне простейщие операции чтение\запись))) функции уже до меня объявлены, а с параметрами борода :)

transserg 19.02.2010 18:55

DiffiT стукни в асю =)

DiffiT 19.02.2010 18:57

RegQueryValueEx(hSubKey, ValueName, nil, @MyValType, nil, @BufSize)
вот в этих сцабаках наверное и есть проблема :)

transserg 19.02.2010 19:12

Код:

hSubKey: HKEY;
ValueName:Pchar;
MyValType:DWORD;
BufSize:DWORD;


iGlass 19.02.2010 20:05

Цитата:

Сообщение от sn0w
пока на нее не подсел переходи на цпп)

Сорри за оффтоп, но почему дельфи так не любят? Что в ней нет, что есть в cpp? :confused:

Tigger 19.02.2010 21:34

Цитата:

Сообщение от iGlass
Сорри за оффтоп, но почему дельфи так не любят? Что в ней нет, что есть в cpp? :confused:


Мдя уж...

iGlass 19.02.2010 21:47

Цитата:

Сообщение от Tigger
Мдя уж...

Опять офф топ....

Но ответ "мдя уж" в данной ситуации мало уместен..

Будьте добры пояснить свою точку зрения.


Время: 15:48