comport algılama ve seçme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
seci20

comport algılama ve seçme

Mesaj gönderen seci20 »

ustalarım merhaba.Comport listesini alabılıyorum usb takıldıgındada algılıyabılıyorum ama comportu listeleyip ıstedıgım comportu sectıremıyorum.Elimde usb guidleride var ama bir turlu basaramadım.yardımcı olma sansınız varmıdır sımdıden cok tesekkur ederım.Usb algılamak ıcın kullandıgım kod sudur.

Kod: Tümünü seç

unit U_Usb;

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;

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

type

  TComponentUSB = class(TComponent)
  private
    FWindowHandle: HWND;
    FOnUSBArrival: TNotifyEvent;
    FOnUSBRemove: TNotifyEvent;
    procedure WndProc(var Msg: TMessage);
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg: TMessage); dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
  end;

implementation

constructor TComponentUSB.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FWindowHandle := AllocateHWnd(WndProc);
  USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
  DeallocateHWnd(FWindowHandle);
  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;

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_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;

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.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: comport algılama ve seçme

Mesaj gönderen SimaWB »

Comport'ları listelemekten bahsediyorsunuz ama USBnin takılıp çıkartılmasını algılayabildiğinizi yazıyorsunuz. Verdiğiniz kodlar da tamamen USB ile alakalı. Başlığa bakılırsa comport'larla ilgileniyorsunuz ama kodlara bakınca iş USB gibi. Nedir amacınız?
There's no place like 127.0.0.1
seci20

Re: comport algılama ve seçme

Mesaj gönderen seci20 »

hocam cevap verdıgınız ıcın cok tesekkur ederım.Onu koymamın sebebı ordakı guid adresını com port olarak ayarlarsam com portu algılıyor.Ama ismini alamıyorum.Yani usb taktık com5 aktif oldu o com5 adını alamıyorum.Listeleme sistemi yapsam dıger comportlarıda listeliyor yaptıgım listeleme kodu.Oraya yazmamın sebebıde ınternette kaynak bulamadım,en yakın bu kaynak var dıye bu kaynagı ekledım.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: comport algılama ve seçme

Mesaj gönderen SimaWB »

Ben yine de tam olarak ne yapmak istediğinizi anlamadım
There's no place like 127.0.0.1
seci20

Re: comport algılama ve seçme

Mesaj gönderen seci20 »

hocam yapmak istediğim şu.Cihaz takıldıgında verdığı comport numarasını almak ıstiyorum.Örneğin cihazı taktık com 3 numarasını verdı ben o com 3 alıp işleme devam edeceğim.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: comport algılama ve seçme

Mesaj gönderen SimaWB »

Comport listelerken isimleri de alabilirsiniz. Bu isimlere bakarak karar verebilirsiniz. Registry'den okuyarak listeleme yapıyorsanız registry key'in değerini okuduğunuz yerde key'in ismini de okuyarak kendi aradığınız cihazı isminden bulabilirsiniz.
Yada buradaki kod örneğini kullanabilirsiniz.
There's no place like 127.0.0.1
seci20

Re: comport algılama ve seçme

Mesaj gönderen seci20 »

hocam listelemede sorun yasamıyorum ama benım basaramadıgım cıhaz bılgısayara takıldıktan sonrakı verilen comportu secmede tek tekde denetemıyorum cunku bırden fazla comport olursa hata ıle karsılasıyorum.Yani benim amacım cihaz bılgısayara takıldıktan sonra verdıgı comportu secme.
Cevapla