Einzelnen Beitrag anzeigen

hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#1

for ..in auf Interface

  Alt 1. Okt 2013, 13:37
Hallo zusammen,

ich habe hier einen Sensor, der mittels USB an den Rechner angeschlossen wird. Die API dieses Sensors bietet die Möglichkeit die Seriennummer des Gerätes auszulesen.
Das ganze sieht unter VBA wie folgt aus:
Code:
Sub Test()

Dim usbserials As tcusbserials
Set usbserials = New tcusbserials
usbserials.Init ("testo435-635-735")
Dim serial As Variant
For Each serial In usbserials

  Debug.Print serial

Next

End Sub
Ich versuche gerade dieses Auslesen in Delphi nachzubauen (letztendlich muss es in Delphi5 laufen)
Für die ersten Versuche wollte ich die ForEach-Schleife in der BDS2006 nachbauen, weiß aber schon dort nicht mehr weiter

Delphi-Quellcode:
procedure TForm1.pshInitClick(Sender: TObject);
var
  oUsb : Ttcusbserials;
  n : IUnknown;
  nSer : Integer;
begin

  oUsb := Ttcusbserials.Create(Self);
  oUsb.AutoConnect := True;
  oUsb.Init('testo435-635-735');
  for n in oUsb do begin

  end; // for n := 0 to
end;
Dabei ist TtcusbSerials wie folgt definiert:
Delphi-Quellcode:
Ttcusbserials = class(TOleServer)
  private
    FIntf: Itcusbserials;
    function GetDefaultInterface: Itcusbserials;
  protected
    procedure InitServerData; override;
    function Get_Count: Integer;
    procedure Set_Count(Value: Integer);
    function Get__NewEnum: IUnknown;
    procedure Set__NewEnum(const Value: IUnknown);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Connect; override;
    procedure ConnectTo(svrIntf: Itcusbserials);
    procedure Disconnect; override;
    function Init(const szFilter: WideString): WordBool;
    property DefaultInterface: Itcusbserials read GetDefaultInterface;
    property _NewEnum: IUnknown read Get__NewEnum write Set__NewEnum;
    property Count: Integer read Get_Count write Set_Count;
  end;

Itcusbserials = dispinterface
    ['{0164C373-41F1-4601-92A9-3595EA07A0FD}']
    function Init(const szFilter: WideString): WordBool; dispid 2;
    property Count: Integer dispid 1;
    property _NewEnum: IUnknown dispid -4;
  end;
Der Compiler meldet in der for-in-Zeile den Fehler Inkompatible Typen 'IInterface' und 'TComponent'
Was ich an dieser Stelle zwar verstehe, aber leider nicht weiß, wie ich es besser mache
Mir ist schon klar, dass ich nicht direkt das oUSB-Objekt verwenden kann, also habe ich es mit dem DefaultInterface versucht:
Delphi-Quellcode:
  for n in oUsb.DefaultInterface do begin

  end;
Fehlermeldung des Compilers: for-in-Anweisung arbeitet nicht mit Kollektionstyp 'Itcusbserials', weil 'Itcusbserials' kein Element für 'GetEnumeratur' enthält ...
Wie kann ich nun den (einfachen) VBA-Code aus Excel nach Delphi portieren? Irgendwie stehe ich auf dem Schlauch ... Im Anhang befindet sich die gesamte Typlibrary der API.

Gruß hsg
Angehängte Dateien
Dateityp: zip Tcddka_TLB.zip (10,5 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat