Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список процессов с путями, Windows Seven! 64-bit 
V
    Опции темы
Attack
Дата 14.12.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Здравствуйте, у меня проблема с получением полного пути к процессам, под Windows Seven (64-bit).
Сам список "exe" файлов получается нормально, делаю это вот так:
Код

var
     hSnapShot: THandle;
     ProcInfo: TProcessEntry32;
begin
     ListBox1.Clear;
     hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnapShot <> THandle(-1)) then
     begin
          ProcInfo.dwSize := SizeOf(ProcInfo);
          if (Process32First(hSnapshot, ProcInfo)) then
          begin
               while (Process32Next(hSnapShot, ProcInfo)) do
               Begin
                    ListBox1.Items.Add(ProcInfo.szExeFile);
               End;
          end;
          CloseHandle(hSnapShot);
     end;
end;

Соответственно в ListBox1 получаю полный список процессов, от всех пользователей.
Дальше мне необходимо получить путь к каждому процессу. Делаю это так:

Код

var
     hSnapShot: THandle;
     ProcInfo: TProcessEntry32;
     ModInfo: TModuleEntry32;
     hSnapShotM: THandle;
begin
     ListBox1.Clear;
     hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnapShot <> THandle(-1)) then
     begin
          ProcInfo.dwSize := SizeOf(ProcInfo);
          ModInfo.dwSize := sizeof(ModInfo);

          if (Process32First(hSnapshot, ProcInfo)) then
          begin
               while (Process32Next(hSnapShot, ProcInfo)) do
               Begin
                    hSnapShotM := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcInfo.th32ProcessID);
                    Module32First(hSnapShotM,ModInfo);
                    ListBox1.Items.Add(ModInfo.szExePath);
                    CloseHandle(hSnapShotM);
               End;
          end;
          CloseHandle(hSnapShot);
     end;
end;


Но путь определяется не правильно! Некоторым процессам приписываются пути других.
Так как грамотно получить пути всех процессов под Севеном?

PM   Вверх
Keeper89
Дата 14.12.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Это смотрели?


--------------------
PM MAIL WWW   Вверх
Attack
Дата 14.12.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Keeper89, да, смотрел )) Та же самая проблема!
PM   Вверх
Keeper89
Дата 14.12.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



К сожалению нет у меня семерки и проверить не могу.  smile 


--------------------
PM MAIL WWW   Вверх
ksili
Дата 14.12.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



У меня есть 64-битная 7-ка. правда прямо сейчас проверить не могу. Пока такие замечания:
Какой разрядности ваше приложение?
А проблемы случайно не с 64-битными приложениями? (например диспетчер задач - taskmgr.exe - 64-битный)

Про фукнцию CreateToolhelp32Snapshot в MSDN написано:
Цитата

If the specified process is a 64-bit process and the caller is a 32-bit process, this call will fail. Note that you can use the QueryFullProcessImageName function to retrieve the full name of an executable image for both 32- and 64-bit processes from a 32-bit process.





--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Attack
Дата 14.12.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



ksili, программа у меня 32-битная.
А что нужно в Uses прописать для QueryFullProcessImageName?
PM   Вверх
Maks1509
Дата 14.12.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.8.2007
Где: г. Тольятти

Репутация: 3
Всего: 5



По хорошему нужно создавать 64-битное приложение, но на данный момент компилятор Delphi этого сделать не может.
Немного иной способ решения данной проблемы я обнаружил на немецком форуме. Посмотрите, может поможет на 7, но в XP x64 работает превосходно.
http://forum.sources.ru/index.php?showtopi...&st=0&#

Это сообщение отредактировал(а) Maks1509 - 14.12.2009, 22:28
PM MAIL ICQ   Вверх
Attack
Дата 15.12.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Maks1509, спасибо, код работает, хотя и значительно обрастает дополнительными функциями ))

Добавлено:
Код не определяет 2 процесса!
Первый с PID = 4 ну это понято это "System"
А вот второй это "audiodg.exe", при выполнении OpenProcess возвращает 0. Порыл в нете, люди говорят что этот процесс защищён, и в него можно залезть только из службы, как то так... мне этот процесс не важен, однако обидно! Причём Диспетчер задач путь его нормально отображает.

Это сообщение отредактировал(а) Attack - 15.12.2009, 01:32
PM   Вверх
ksili
Дата 15.12.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(Attack @  15.12.2009,  00:47 Найти цитируемый пост)
А что нужно в Uses прописать для QueryFullProcessImageName?

Что-то я сразу не заметил, что эта тема в Delphi.
Для Visual Studio я качал WinSDK for Windows 7, чтобы использовать функции, которые появились в висте и семёрке.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Демо
Дата 15.12.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Attack @  14.12.2009,  20:47 Найти цитируемый пост)
А что нужно в Uses прописать для QueryFullProcessImageName?


Ну можно описатьтак, например:

Код

function QueryFullProcessImageNameA(Process: THandle; Flags: DWORD;
  Buffer: PChar; Size: PDWORD): DWORD; stdcall; external 'kernel32.dll';


Но лучше использовать динамическую линковку.


--------------------
    
PM MAIL ICQ Skype   Вверх
Демо
Дата 15.12.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Attack @  15.12.2009,  00:46 Найти цитируемый пост)
А вот второй это "audiodg.exe", при выполнении OpenProcess возвращает 0

Открывай этот процесс с привилегией PROCESS_QUERY_LIMITED_INFORMATION ($1000).



--------------------
    
PM MAIL ICQ Skype   Вверх
Attack
Дата 15.12.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Демо, спасибо, однако только сейчас заметил один странный глюк:

user posted image

Слева программа запущена из среды(F9), а справа просто из системы (с правами админа)
почему csrss.exe не опознался?
PM   Вверх
Демо
Дата 15.12.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



У меня одинаково.

Привилегии на отладку получаешь?


--------------------
    
PM MAIL ICQ Skype   Вверх
Attack
Дата 15.12.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Демо, нет конечно =) Сейчас попробую.

Добавлено:
Вот что получилось:

Код

unit Unit1;

interface

uses
     TLHelp32,
     PsAPI,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  
function QueryFullProcessImageNameW(Process: THandle; Flags: DWORD; Buffer: PChar; Size: PDWORD): DWORD;
     stdcall; external 'kernel32.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function GetProcessFilePath(PID: Cardinal): String;
     Function IsWin2k: Boolean;
     begin
          Result := (Win32MajorVersion = 5) and (Win32Platform = VER_PLATFORM_WIN32_NT);
     end;

     Function IsWinNT4: Boolean;
     begin
          Result := (Win32MajorVersion = 4) and (Win32Platform = VER_PLATFORM_WIN32_NT);
     end;
Const
     PROCESS_QUERY_LIMITED_INFORMATION = $1000;
var
     hP        :    THandle;
     Buffer    :    Array[0..MAX_PATH] of Char;
     S         :    DWORD;
begin
     Result := '';

     if PID > 0 then
     begin
          if IsWinNT4 or IsWin2K then
          begin
               hP := OpenProcess(PROCESS_QUERY_INFORMATION, False, PID);
               if hP > 0 then
                    if GetModuleFileNameEx(hP, 0, Buffer, Length(Buffer)) > 0 then Result :=
                         StringReplace(Buffer, '\??\', '', [rfReplaceAll, rfIgnoreCase]);
          end
          else
          begin
               hP := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, PID);
               if hP > 0 then
                    if QueryFullProcessImageNameW(hP, 0, @Buffer, @S) > 0 then Result := String(Buffer);
          end;
          CloseHandle(hP);
     end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
     hSnapShot: THandle;
     ProcInfo: TProcessEntry32;


     hToken              :    THandle;
     SeDebugNameValue    :    Int64;
     tkp                 :    TOKEN_PRIVILEGES;
     ReturnLength        :    Cardinal;
begin
     ListBox1.Clear;

///   Добавляем привилегию   /////////////////////////////////////////////////////////////////////////////////
     if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then     ///
          exit;                                                                                            ///
                                                                                                           ///
     if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue ) then                         ///
     begin                                                                                                 ///
          CloseHandle(hToken);                                                                             ///
          exit;                                                                                            ///
     end;                                                                                                  ///
                                                                                                           ///
     tkp.PrivilegeCount:= 1;                                                                               ///
     tkp.Privileges[0].Luid := SeDebugNameValue;                                                           ///
     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;                                                 ///
                                                                                                           ///
     AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);                                 ///
     if GetLastError() <> ERROR_SUCCESS  then exit;                                                        ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////


     hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (hSnapShot <> THandle(-1)) then
     begin
          ProcInfo.dwSize := SizeOf(ProcInfo);
          if (Process32First(hSnapshot, ProcInfo)) then
          begin
               while (Process32Next(hSnapShot, ProcInfo)) do
               Begin
                    case ProcInfo.th32ProcessID of
                         4: ListBox1.Items.Add('[System]');
                    else
                         ListBox1.Items.Add(GetProcessFilePath(ProcInfo.th32ProcessID));
                    end;
               End;
          end;
          CloseHandle(hSnapShot);
     end;

///   Удаляем привилегию   ///////////////////////////////////////////////////////////
     tkp.Privileges[0].Attributes := 0;                                            ///
     AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);    ///
     if GetLastError() <>  ERROR_SUCCESS then exit;                                ///
//////////////////////////////////////////////////////////////////////////////////////
end;

end.


Всем большое СПАСИБО!

Это сообщение отредактировал(а) Attack - 15.12.2009, 22:38
PM   Вверх
Демо
Дата 15.12.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Attack @  15.12.2009,  21:25 Найти цитируемый пост)
 if QueryFullProcessImageNameW(hP, 1, @Buffer, @S) > 0 then Result :=


Если тебе сразу путь нужно получить без пути с устройством, то нужно было параметр 0 использовать просто:
Код

 QueryFullProcessImageNameW(hP, 0, @Buffer, @S)



--------------------
    
PM MAIL ICQ Skype   Вверх
Attack
Дата 15.12.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Демо, поправил, спасибо.
PM   Вверх
CodeMonkey
Дата 6.1.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Любопытно, что этот код показывает все процессы только, если у вас есть права админа (под ограниченной учёткой никто вам DEBUG-привилегию не даст, а без неё вы сможете получить пути только к своим процессам).

В то же время Process Explorer показывает полные пути, даже будучи запущенным без админа. Может дело в 64-х разрядности?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Демо
Дата 7.1.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(CodeMonkey @  6.1.2010,  20:03 Найти цитируемый пост)
В то же время Process Explorer показывает полные пути, даже будучи запущенным без админа. 



Попробовал на XP x86 под ограниченной учётной записью - не показывает пути.


--------------------
    
PM MAIL ICQ Skype   Вверх
CodeMonkey
Дата 7.1.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата(Демо @  7.1.2010,  01:01 Найти цитируемый пост)
Попробовал на XP x86 под ограниченной учётной записью - не показывает пути

Да, я уже проверил тоже smile Видимо, так и должно быть.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
gonzales
Дата 29.3.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: нет
Всего: 2



поясните тупому.
Код

if QueryFullProcessImageNameW(hP, 0, @Buffer, @S) > 0 then Result := String(Buffer);

у меня не преобразует buffer в строку, возвращает только первый символ, после которого идет #0. Как вернуть нормально всю строку?
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
CodeMonkey
Дата 30.3.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата(gonzales @  29.3.2010,  23:53 Найти цитируемый пост)
Как вернуть нормально всю строку? 

По порядку:
1. Оторвать руки писавшему.
2. Поправить of Char на of WideChar (т.к. вызывается wide-версия с "W").
3. Убрать String(Buffer), оставив просто Buffer.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Gwire
Дата 30.3.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: нет
Всего: 4




Код

var WS:  WideString;
    S: Cardinal;
. . .
SetLength(WS, S);
S:= QueryFullProcessImageNameW(hP, 0, @WS[1], @S);
SetLength(WS, S);


PM MAIL   Вверх
malor
  Дата 8.11.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Демо>>Привилегии на отладку получаешь? 

Вставил куски "Добавляем привилегию"/"Удаляем привилегию" из поста Attack к себе в прогу, убивающую explorer.exe.
Имеем :
Код
function KillExplorer(): boolean;
var
  FSnapshotHandle, ProcessHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  S : String;
  res : Word;

  hSnapShot: THandle;
  ProcInfo: TProcessEntry32;
  hToken              :    THandle;
  SeDebugNameValue    :    Int64;
  tkp                 :    TOKEN_PRIVILEGES;
  ReturnLength        :    Cardinal;

begin

///   Добавляем привилегию   /////////////////////////////////////////////////////////////////////////////////
     if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then     ///
       exit;                                                                                               ///
                                                                                                           ///
     if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue ) then                         ///
     begin                                                                                                 ///
       CloseHandle(hToken);                                                                                ///
       exit;                                                                                               ///
     end;                                                                                                  ///
                                                                                                           ///
     tkp.PrivilegeCount:= 1;                                                                               ///
     tkp.Privileges[0].Luid := SeDebugNameValue;                                                           ///
     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;                                                 ///
                                                                                                           ///
     AdjustTokenPrivileges(hToken, false, tkp, SizeOf(tkp), tkp, ReturnLength);                            ///
     if GetLastError() <> ERROR_SUCCESS  then exit;                                                        ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

  Result := True;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  Process32First(FSnapshotHandle, FProcessEntry32);
  repeat
    If (FProcessEntry32.szExeFile = TerminateName) then
    Begin
      //ShowMessage('Найден explorer.exe!');
      ProcessHandle := OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID);
      res := GetLastError();
      if ProcessHandle <> 0 then
        begin
          Result := Result and  TerminateProcess(ProcessHandle, 1);
          if (not Result) then
            MessageBox(0, Pchar(SysErrorMessage(GetLastError)), 'Error1', 0);
          CloseHandle(ProcessHandle);

        end
        else
          //MessageBox(0, Pchar(SysErrorMessage(GetLastError)), 'Error2', 0);
  End;
  Until not Process32Next(FSnapshotHandle, FProcessEntry32);

  CloseHandle(FSnapshotHandle);

///   Удаляем привилегию   ///////////////////////////////////////////////////////////
     tkp.Privileges[0].Attributes := 0;                                            ///
     AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);    ///
     if GetLastError() <>  ERROR_SUCCESS then exit;                                ///
//////////////////////////////////////////////////////////////////////////////////////

end;


Пользователь, под которым работаю - с администраторскими правами.
Но GetLastError() вернула ERROR_ACCESS_DENIED.  Почему ?

WinXP SP3

Это сообщение отредактировал(а) malor - 8.11.2011, 15:01

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  RunExplorerProject.zip 85,67 Kb
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.2109 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.