WinAPI в Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DiffiT, 19 Feb 2010.

  1. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    В общем, не догоняю, как объявить API-функцию.

    Из гугла/яндекса толкового почти ничего не выжал. только примерно вот это (и то не работает)
    Code:
    function GetWindowDC(Wnd: HWnd): hDC;
    stdcall; extenal 'user32.dll' name 'GetWindowDC';
    Всяко экспериментировал, но нирвзу не заработало. Честно говоря, я ваще толком не знаю, куда это писать... Объясните дураку...

    И ещё пытался с реестром бодаться (Там функции в 'Windows' объявлены). Тоже не вышло ничего, хотя в ВБ те же функции спокойно юзаю...
     
    #1 DiffiT, 19 Feb 2010
    Last edited: 19 Feb 2010
  2. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    пока на нее не подсел переходи на цпп)
     
  3. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    не подсяду) просто всё по порядку :)
     
  4. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    uses Windows
    Эта функция там описана
     
  5. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    Мне не конкретно эту функцию надо.
     
  6. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    Млин, вся опа в том, что вопрос простейший, а ответа нет. Просто дельфин не родной для мну язык, вот и парюсь :)
     
  7. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    Вроде в первом посту функция выглядит правильно. Может только в одну строку ее записать. А что конкретно не работает?
     
  8. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    DiffiT
    Code:
    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.
    
    в модуле должно выглядеть примерно так
    если ты объявляешь функцию так же как она в библиотеке названа то имя
    Code:
    name 'GetModuleFileNameExA';
    
    можно не писать..
     
    #8 transserg, 19 Feb 2010
    Last edited: 19 Feb 2010
    1 person likes this.
  9. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    вроде, так и делаю.. =) щас ещё раз попробую :)
     
  10. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    ;) спасибо, заработало)))) не туда писал, как оказалось)))) Пробовал писать в type, как функцию формы, пробовал в public и в private :) щас вкурил, зачем там end был))))
     
  11. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    а по поводу реестра, у кого-нить есть рабочий исходник? А то я офигеваю с типов PAnsiChar и Cardinal :D
    Всё никак с параметрами угадать не могу))))
     
    #11 DiffiT, 19 Feb 2010
    Last edited: 19 Feb 2010
  12. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    DiffiT что именно хочешь с реестром делать. пример чтения и поиска есть... записать написать не сложно
     
    #12 transserg, 19 Feb 2010
    Last edited: 19 Feb 2010
  13. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    Code:
    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;
    
    процедура обхода дерева реестра
    первый параметр подраздел один из
    Code:
                          HKEY_CLASSES_ROOT 
                          HKEY_CURRENT_USER 
                          HKEY_LOCAL_MACHINE
                          HKEY_USERS           
                          HKEY_PERFORMANCE_DATA 
                          HKEY_CURRENT_CONFIG   
                          HKEY_DYN_DATA         
    
    
    второй параметр это ключ с которого начнется перебор если пустой то будет перебирать с корня под раздела
    Code:
    ResultAnalize(RootKey,PChar(SubKey),NameValue);
    
    процедура анализа в которой ты собственно и удовлетворяют ли считанные данные условию поиска
     
  14. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    вот часть кода на чтение значения
    Code:
      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 указатель на значение параметра
     
  15. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    мне простейщие операции чтение\запись))) функции уже до меня объявлены, а с параметрами борода :)
     
  16. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    DiffiT стукни в асю =)
     
  17. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    RegQueryValueEx(hSubKey, ValueName, nil, @MyValType, nil, @BufSize)
    вот в этих сцабаках наверное и есть проблема :)
     
  18. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    Code:
    hSubKey: HKEY;
    ValueName:Pchar;
    MyValType:DWORD;
    BufSize:DWORD;
    
     
  19. iGlass

    iGlass New Member

    Joined:
    14 May 2009
    Messages:
    86
    Likes Received:
    1
    Reputations:
    0
    Сорри за оффтоп, но почему дельфи так не любят? Что в ней нет, что есть в cpp? :confused:
     
  20. Tigger

    Tigger Elder - Старейшина

    Joined:
    27 Aug 2007
    Messages:
    936
    Likes Received:
    527
    Reputations:
    204

    Мдя уж...