@horst0815: Danke, aber das sind Punkte, die kommen erst noch deutlich später. Wen ich mal bis zu diesem Schritt gekommen bin, werd ich da sicherlich auch Infos rausziehen können...
@brechi: Der Bezugspunkt bezüglich deiner 'Array of Byte' Anmerkung ist nicht ganz klar geworden. Hatte in den bisherigen Postings keine solche Struktur.
Die Funktion PvCameraListEx der
DLL kann ich erstmal fehlerfrei anrufen. Allerdings erzeugt der Aufruf :
Delphi-Quellcode:
tPvInterface =
(ePvInterfaceFirewire = 1, // Firewire interface
ePvInterfaceEthernet = 2, // Ethernet interface
__ePvInterface_force_32 = $FFFFFFFF
);
tPvCameraInfoEx = Packed Record
StructVer : Cardinal; // Version of this structure
//---- Version 1 ----
UniqueId : Cardinal; // Unique value for each camera
CameraName : Array [0..31] of Byte; // People-friendly camera name (usually part name)
ModelName : Array [0..31] of Byte; // Name of camera part
PartNumber : Array [0..31] of Byte; // Manufacturer's part number
SerialNumber : Array [0..31] of Byte; // Camera's serial number
FirmwareVersion : Array [0..31] of Byte; // Camera's firmware version
PermittedAccess : Cardinal; // A combination of tPvAccessFlags
InterfaceId : Cardinal; // Unique value for each interface or bus
InterfaceType : tPvInterface; // Interface type; see tPvInterface
end;
tPvCameraInfoExList = array of tPvCameraInfoEx;
pPvCameraInfoExList = ^tPvCameraInfoExList;
tConnectedCams = Cardinal;
pConnectedCams = ^tConnectedCams;
Function PvCameraListEx (pList : pPvCameraInfoExList; ListLength : Cardinal; pConnectedNum : pConnectedCams; Size : Cardinal) : Cardinal; stdcall; external 'PvAPI.dll';
auf folgende Weise:
Delphi-Quellcode:
Var listAVTGigECams : tPvCameraInfoExList;
valNumberOfCams : Cardinal;
valAvailableCams : Cardinal;
i: Integer;
begin
SetLength (listAVTGigECams, 1);
valNumberOfCams := PvCameraListEx (@listAVTGigECams, Length (listAVTGigECams), @valAvailableCams, SizeOf (tPvCameraInfoEx));
Sleep (100);
memo1.Lines.Add ('High value : ' + IntToStr(High (listAVTGigECams)));
memo1.Lines.add ('Number of cams in list : ' + IntToStr (valNumberOfCams));
memo1.Lines.add ('Number of cams available: ' + IntToStr (valAvailableCams));
For i := 00 to valNumberofCams-1 do
Begin
Memo1.Lines.Add (IntToStr (listAVTGigECams[i].UniqueID));
Memo1.Lines.Add (Chr(listAVTGigECams[i].CameraName[0]));
end;
end;
ein merkwürdiges Verhalten. wenn man das ganze im Debugger beobachtet, dann beinhaltet das Array
listAVTGigECams nach SetLength genau einmal den Record. Nachdem die Funktion
PvCameraListEx aufgerufen wurde, besitzen die Variablen
valNumberOfCams und
valAvailableCams die korrekten Werte (eine Kamera) in der Liste der lokalen Variablen des Dubuggers.
Das Array
listAVTGigECams besitzt allerdings plötzlich 131072 (0..131071) Elemente, wovon die ersten 365 (0..364) leer sind. Das Element 366 (Index 365) beinhaltet die erwartete Record Struktur; wenn auch mit komplett unherleitbaren Werten. Gleiches gilt für die folgenden Elemente. Element 752-1093 (Index 751-1092) ist wieder leer und so weiter.
Nach dem Aufruf der Funktion PvCameraListEx kann man auch nicht mehr auf die anderen Variablen zugreifen (oben z.B. in den Memo1.lines.Add); hier werden vermutlich Speicherzuweisungen überschrieben.
Ich habe momentan die Vermutung, daß es an der Definition von
tPvCameraInfoEx liegt. Das SizeOf zeigt mit 180 den Wert an, den ich erwarten würde. Allerdings ist mir die Indizierungs des Arrays auffällig mit 2*180+5 verknüpft. Es sind 5 Arrays of Byte da drin. Ich hab versucht an diversen Stelen nachzulesen (unter anderem Asserbads
DLL Manual) und hab eine Übersetzungsempfehlung für
char CameraName[32]
mit
CameraName : Array [00..31] of Byte
gefunden. Ein Char geht nicht mehr, da es unter DelphiXE dem WideChar entspricht; obgleich man dann ja wohl auch AnsiChar verwenden könnte. Die Größe von tPvInterface scheint durch den $FFFFFFFF Wert korrekt auf 4 Byte aliniert zu werden.
Wenn die Kamera abgezogen ist, wird das Array nicht bestückt und man kann auch auf die Variablen
valNumberOfCams und
valAvailableCams zugreifen.
[...]