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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отслеживание USB-устройства, WM_DEVICECHANGE, USB 
:(
    Опции темы
Keeper89
Дата 11.10.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Доброго времени суток!

Взял вот этот код для работы с USB-устройством. Как можно добавить в него определение буквы вставленного устройства, например флешки? И что делать. если оно составное?

Заранее спасибо.

Это сообщение отредактировал(а) Keeper89 - 11.10.2009, 00:05


--------------------
PM MAIL WWW   Вверх
~FoX~
Дата 11.10.2009, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



Код

type
  TForm1 = class(TForm)
//...................
  private
     procedure WMDeviceChange(var Msg: TMessage); message WM_DeviceChange;
//...................
const
   DBT_DeviceArrival = $8000;
   DBT_DeviceRemoveComplete = $8004;

//...................

type
   PDevBroadcastVolume = ^TDevBroadcastVolume;
   TDevBroadcastVolume = packed record
     dbcv_size: DWORD;
     dbcv_devicetype: DWORD;
     dbcv_reserved: DWORD;
     dbcv_unitmask: DWORD;
     dbcv_flags: Word;
   end;

//...................
  function GetDrive(pDBVol: PDevBroadcastVolume): string;
//...................

function GetDrive(pDBVol: PDevBroadcastVolume): string;
var
  i: Byte;
  Maske: DWORD;
begin
  Maske := pDBVol^.dbcv_unitmask;
  for i := 0 to 25 do begin
    if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ':';
    Maske := Maske shr 1;
  end;
end;

//...................
procedure TForm1.WMDeviceChange(var Msg: TMessage);
var
  Drive: string;
begin
  Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
end;


Так определяется буква драйва....А что значит составное? 


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Keeper89
Дата 11.10.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Спасибо, тоже нашел этот код сегодня. smile

Составное - это например вставка кардридера, где устройство одно, а разделов может быть несколько.

Это сообщение отредактировал(а) Keeper89 - 11.10.2009, 10:20


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


НЕ рыжий!!!
****


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

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



Keeper89, Теоретически пофигу должно быть, этот код ловит не только USB но и сидюки, пробовал вставлять одновременно - ловица по очереди...К сожалению кардридера нету, но скорее всего должно последовательно поймаца... Если проверишь, сообщи результаты, самому интересно стало  smile 

З.Ы.: Нашел...странно, я его сам по МСДН-у писал...  smile 

Это сообщение отредактировал(а) ~FoX~ - 11.10.2009, 11:20


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Keeper89
Дата 11.10.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(~FoX~ @  11.10.2009,  12:17 Найти цитируемый пост)
З.Ы.: Нашел...странно, я его сам по МСДН-у писал...  smile 

Вот тут моя находка.
Цитата(~FoX~ @  11.10.2009,  12:17 Найти цитируемый пост)
Теоретически пофигу должно быть, этот код ловит не только USB но и сидюки, пробовал вставлять одновременно - ловица по очереди

Ага. твой код ловит все, а тот что у Snowy - только USB. т.к. для этого при создании регистрируется специальный отлов. 
Поэтому я и думаю, как определить букву диска после определения именно USB. Пробовал сначала так (определить букву не важно какого девайса):
Код

procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
var 
  devType: Integer;
  Datos: PDevBroadcastHdr;
begin
  if (Msg.wParam = DBT_DEVICEARRIVAL) or
     (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
  begin
      Datos := PDevBroadcastHdr(Msg.lParam);
      devType := Datos^.dbch_devicetype;
      if devType = DBT_DEVTYP_VOLUME then
      begin
        FDriveLetter := GetUSBDriveLetter(PDevBroadcastVolume(Msg.lParam));
      end;
      if devType = DBT_DEVTYP_DEVICEINTERFACE then
      begin // USB Device
        if Msg.wParam = DBT_DEVICEARRIVAL
        then
        begin
          if Assigned(FOnUSBArrival) then FOnUSBArrival(Self);
        end
        else
        begin
          if Assigned(FOnUSBRemove) then FOnUSBRemove(Self);
        end;
      end;
  end;
end;

Но судя по всему условие devType = DBT_DEVTYP_VOLUME не выполняется при вставе флешки.  smile 

Это сообщение отредактировал(а) Keeper89 - 11.10.2009, 11:33


--------------------
PM MAIL WWW   Вверх
~FoX~
Дата 11.10.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



Keeper89, Счаз нету компилера, но кто мешает отдибагить код и посмотреть, что собственно попадает в dbcv_devicetype при вставлении флехи?
А dbcv_devicetype - это ж логическая метка диска....

http://forum.vingrad.ru/faq/topic-157620.html


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Keeper89
  Дата 12.10.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Добавил в компонент список, содержащий подсоединенные флеш-драйвы:
Код

unit ComponentUSB;
    
interface

uses 
  Windows, Messages, SysUtils, Classes, Forms;
    

type
  PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;

  PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;

  PDevBroadcastVolume = ^TDevBroadcastVolume;
  TDevBroadcastVolume = packed record
    dbcv_size: DWORD;
    dbcv_devicetype: DWORD;
    dbcv_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: Word;
  end;
    

const 
  GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  DBT_DEVICEARRIVAL = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
  DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

  DBTF_Media = $0001;
  DBT_DevTyp_Volume = $0002;

type
  TComponentUSB = class(TComponent)
  private
    FWindowHandle: HWND;
    FOnUSBArrival: TNotifyEvent;
    FOnUSBRemove: TNotifyEvent;
    FDrivesList: TStringList; // Список подсоединенных флешек
    procedure WndProc(var Msg: TMessage);
    function GetDrive(pDBVol: PDevBroadcastVolume): string;
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg: TMessage); dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property DrivesList: TStringList read FDrivesList;
  published
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
  end;

procedure Register;

implementation
    
constructor TComponentUSB.Create(AOwner: TComponent);
begin 
  inherited Create(AOwner);
  FWindowHandle := AllocateHWnd(WndProc);
  FDrivesList := TStringList.Create();
  USBRegister;
end;
    
destructor TComponentUSB.Destroy; 
begin
  DeallocateHWnd(FWindowHandle);
  FDrivesList.Free;
  inherited Destroy;
end;

procedure TComponentUSB.WndProc(var Msg: TMessage); 
begin 
  if (Msg.Msg = WM_DEVICECHANGE) then
  begin
    try
      WMDeviceChange(Msg);
    except
      Application.HandleException(Self);
    end;
  end
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

function TComponentUSB.GetDrive(pDBVol: PDevBroadcastVolume): string;
var
  i: Byte;
  Mask: DWORD;
begin

  Result := EmptyStr;

  Mask := pDBVol^.dbcv_unitmask;
  for i := 0 to 25 do
  begin
    if (Mask and 1) = 1 then
      Result := Char(i + Ord('A')) + ':\';
    Mask := Mask shr 1;
  end;
end;

procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
var 
  devType: Integer;
  Datos: PDevBroadcastHdr;
  i: Integer;
  v:PDevBroadcastVolume;
  curDrive: string;
  oldIndex: Integer;
begin
  if (Msg.wParam = DBT_DEVICEARRIVAL) or
     (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
  begin
      Datos := PDevBroadcastHdr(Msg.lParam);
      devType := Datos^.dbch_devicetype;

      // Определяем букву диска
      if Datos^.dbch_devicetype = DBT_DEVTYP_VOLUME then
      begin
        curDrive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        if Msg.wParam = DBT_DEVICEARRIVAL
        then
        begin
          FDrivesList.Add(curDrive)
        end
        else
        begin
          oldIndex := FDrivesList.IndexOf(curDrive);
          if oldIndex <> -1 then
            FDrivesList.Delete(oldIndex);
        end;
      end;

       // USB Device
      if devType = DBT_DEVTYP_DEVICEINTERFACE then
      begin
        if Msg.wParam = DBT_DEVICEARRIVAL
        then
        begin
          if Assigned(FOnUSBArrival) then
            FOnUSBArrival(Self);
        end
        else
        begin
          if Assigned(FOnUSBRemove) then
            FOnUSBRemove(Self);
        end;
      end;
  end;
end;    

function TComponentUSB.USBRegister: Boolean;
var
  dbi: DEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
  r: Pointer;
begin
  Result := False;
  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := 0;
  r := RegisterDeviceNotification(FWindowHandle, @dbi,
                                  DEVICE_NOTIFY_WINDOW_HANDLE);
  if Assigned(r) then Result := True;
end;
    
procedure Register;
begin
  RegisterComponents('System', [TComponentUSB]);
end;

end.

Единственная проблема - флешка при вставке определяется как бы с запозданием. Т.е. при вставке диска (в событии OnUSBArrival) в списке нового драйва нет, но если обратится к списку позже (через секунду, например), он будет в списке.  smile  smile 

Вот, в чем я не прав?  smile 

Это сообщение отредактировал(а) Keeper89 - 13.10.2009, 13:17


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


Эксперт
****


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

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



При этом, если заменить
Код

FDrivesList.Add(curDrive)

на
Код

Showmessage('ARRIVED' + curDrive);

и аналогично для извлечения флешки - буква в сообщении отображается.  smile 

З.Ы. Тоже самое происходит, если переделать компонент в класс.

Это сообщение отредактировал(а) Keeper89 - 13.10.2009, 14:02


--------------------
PM MAIL WWW   Вверх
~FoX~
Дата 14.10.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



Keeper89, Что не очень понял в чем собственно проблема....Повесь на OnUSBArrival и на OnUSBRemove по мессаге, что то мне подсказывает что оно срабатывает подряд....


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Keeper89
Дата 14.10.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



~FoX~, повесил. Сообщения высвечиваются в такой последовательности:
Цитата

ВСТАВКА USB - ВСТАВКА USB - ОПРЕДЕЛЕНИЕ БУКВЫ ДИСКА - ОПРЕДЕЛЕНИЕ БУКВЫ ДИСКА

Т.е. каждое событие по 2 раза. При этом буква определяется позже исходя из сообщений. 

З.Ы. Я работаю не с компонентом. а с классом. На всякий случай его код:
Код

unit ComponentUSBMOD;
    
interface

uses 
  Windows, Messages, SysUtils, Classes, Forms, Dialogs;
    

type
  PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;

  PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;

  PDevBroadcastVolume = ^TDevBroadcastVolume;
  TDevBroadcastVolume = packed record
    dbcv_size: DWORD;
    dbcv_devicetype: DWORD;
    dbcv_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: Word;
  end;

const 
  GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  DBT_DEVICEARRIVAL = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
  DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

  DBTF_Media = $0001;
  DBT_DevTyp_Volume = $0002;

type
  TComponentUSB = class(TObject)
  private
    FWindowHandle: HWND;
    FOnUSBArrival: TNotifyEvent;
    FOnUSBRemove: TNotifyEvent;
    FDrivesList: TStrings; // Список подсоединенных флешек
    procedure WndProc(var Msg: TMessage);
    function GetDrive(pDBVol: PDevBroadcastVolume): string;
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg: TMessage); dynamic;
  public
    constructor Create;
    destructor Destroy; override;
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
    property DrivesList: TStrings read FDrivesList;
  end;

implementation
    
constructor TComponentUSB.Create();
begin 
  FWindowHandle := AllocateHWnd(WndProc);
  FDrivesList := TStringList.Create();
  USBRegister;
end;
    
destructor TComponentUSB.Destroy; 
begin
  DeallocateHWnd(FWindowHandle);
  FDrivesList.Free;
  inherited Destroy;
end;

procedure TComponentUSB.WndProc(var Msg: TMessage); 
begin 
  if (Msg.Msg = WM_DEVICECHANGE) then
  begin
    try
      WMDeviceChange(Msg);
    except
      Application.HandleException(Self);
    end;
  end
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

function TComponentUSB.GetDrive(pDBVol: PDevBroadcastVolume): string;
var
  i: Byte;
  Mask: DWORD;
begin
  Result := EmptyStr;

  Mask := pDBVol^.dbcv_unitmask;
  for i := 0 to 25 do
  begin
    if (Mask and 1) = 1 then
      Result := Char(i + Ord('A')) + ':\';
    Mask := Mask shr 1;
  end;
end;

procedure TComponentUSB.WMDeviceChange(var Msg: TMessage);
var 
  devType: Integer;
  Datos: PDevBroadcastHdr;
  curDrive: string;
  oldIndex: Integer;
begin
  if (Msg.wParam = DBT_DEVICEARRIVAL) or
     (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
  begin
      Datos := PDevBroadcastHdr(Msg.lParam);
      devType := Datos^.dbch_devicetype;

      // Определяем букву диска
      if Datos^.dbch_devicetype = DBT_DEVTYP_VOLUME then
      begin
        curDrive := GetDrive(PDevBroadcastVolume(Msg.lParam));
        if Msg.wParam = DBT_DEVICEARRIVAL
        then
        begin
          FDrivesList.Add(curDrive);
          Showmessage('ARRIVED DISK : ' + FDrivesList[FDrivesList.Count-1]);
        end
        else
        begin
          oldIndex := FDrivesList.IndexOf(curDrive);
          if oldIndex <> -1 then
            FDrivesList.Delete(oldIndex);
          Showmessage('REMOVED DISK : ' + curDrive);
        end;
      end;

       // USB Device
      if devType = DBT_DEVTYP_DEVICEINTERFACE then
      begin
        if Msg.wParam = DBT_DEVICEARRIVAL
        then
        begin
          if Assigned(FOnUSBArrival) then
            FOnUSBArrival(Self);
        end
        else
        begin
          if Assigned(FOnUSBRemove) then
            FOnUSBRemove(Self);
        end;
      end;
  end;
end;    

function TComponentUSB.USBRegister: Boolean;
var
  dbi: DEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
  r: Pointer;
begin
  Result := False;
  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := 0;
  r := RegisterDeviceNotification(FWindowHandle, @dbi,
                                  DEVICE_NOTIFY_WINDOW_HANDLE);
  if Assigned(r) then Result := True;
end;
    
end.


Это сообщение отредактировал(а) Keeper89 - 14.10.2009, 21:04


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


Новичок



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

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



у меня при добавлении этого компонента в delphi возникает ошибка в строке:

FWindowHandle := AllocateHWnd(WndProc);

- что это такое? Она нигде не объявлена
PM MAIL   Вверх
~FoX~
Дата 13.3.2011, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



Код

FWindowHandle: HWND;

lkz, какая ошибка?

Это сообщение отредактировал(а) ~FoX~ - 13.3.2011, 01:44


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
lkz
Дата 13.3.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



AllocateHWnd(WndProc); - 
и deAllocateHWnd(WndProc);   -  ?
PM MAIL   Вверх
~FoX~
Дата 13.3.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


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

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



В uses добавь Classes


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
lkz
Дата 25.3.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Classes - прописывается Delphi. - у меня он стоит
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1184 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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