Seite 1 von 1
C++ - DLL aufruf umsetzen ->PureBasic
Verfasst: 13.03.2007 17:18
von PBuser
Hallo zusammen
ich habe eine C++ DLL. Aus dieser DLL soll ein USB-Device ausgelesen werden.
Hier der Aufruf laut Doku
prCAPI PR_GetDeviceList(prUInt32* pBufferSize, prDeviceList* pDeviceList);
Folgende Struktur ist gegeben:
#define prANY 1
typedef unsigned short prUInt16;
typedef unsigned long prUInt32;
typedef unsigned short prWChar;
#define MY_BUFFER_SIZE 20480L /* 20KB */
typedef struct{
prWChar DeviceInternalName[512] ;/* Internal devicve name (512 characters) */
prWChar ModelName[32]; /* Camera model name (32 characters) */
prUInt16 Generation; /* Camera generation number */
prUInt32 Reserved1; /* Reserved */
prUInt32 ModelID; /* Camera model ID */
prUInt16 Reserved2; /* Reserved */
prPorttype PortType; /* Port type 0x01
Verfasst: 13.03.2007 17:48
von ts-soft
Deine Strukturen sind IMHO inkorrekt. Fixe Strings würden nur im
Unicode-Modus funktionieren. Port ist nirgends als word definiert, also long.
Evtl. so:
Code: Alles auswählen
Structure prDeviceInfoTable
DeviceInternalName.w[512]
ModelName.w[32]
Generation.w
Reserved1.w
ModelID.l
Reserved2.w
PortType.l
Reserved3.l
EndStructure
Structure prDeviceList
NumList.l
DeviceInfo.prDeviceInfoTable[0]
EndStructure
Strings mit peek und poke nutzen (Unicode)
Für DeviceInfo.prDeviceInfoTable[0] ist Speicher zu allokieren
Verfasst: 13.03.2007 18:48
von PBuser
Hallo ts-soft.
Vielen Dank für Deine Antwort.
Was heist Speicher allokiern?
Machen das diese C-Aufrufen?
Das habe ich nicht richtig verstanden!
BufferSize = MY_BUFFER_SIZE;
memset(Buffer, 0, MY_BUFFER_SIZE); <--20KB werden auf 0 gesetzt ?
Was wird hier eigentlich übergeben?
Ich dachte die Struktur?
err = PR_GetDeviceList(&BufferSize, (prDeviceList *)Buffer);
memset(DeviceListBuffer, 0, MY_BUFFER_SIZE); <- wird auf 0 gesetzt?
memcpy(DeviceListBuffer, Buffer, BufferSize); <- wird was kopiert ?
Danke
Verfasst: 13.03.2007 19:05
von ts-soft
So ähnlich könnte es funktionieren:
Code: Alles auswählen
Structure prDeviceInfoTable
DeviceInternalName.w[512]
ModelName.w[32]
Generation.w
Reserved1.w
ModelID.l
Reserved2.w
PortType.l
Reserved3.l
EndStructure
Structure prDeviceList
NumList.l
*DeviceInfo.prDeviceInfoTable[0]
EndStructure
Prototype PR_GetDeviceList(*pBufferSize, *pDeviceList)
Define.l lib = OpenLibrary(#PB_Any, "C++.dll")
Define.prDeviceList test
Define.l Mem, I
If lib
GetDeviceList.PR_GetDeviceList = GetFunction(Lib, "PR_GetDeviceList")
Mem = AllocateMemory(2048)
If Mem
GetDeviceList(Mem, @test)
For I = 0 To test\NumList
Debug PeekS(test\DeviceInfo[I]\ModelName[0], 32, #PB_Unicode)
Next
EndIf
EndIf
Aber ohne DLL kann ichs nicht testen, c++ mag ich auch nicht

Verfasst: 15.03.2007 12:31
von PBuser
Hallo ts-soft
Das mit dem Speicher allokieren und mit Peek zuzugreifen war eine gute Idee.
Habe jetzt den Return-Wert des DLL-Aufruf in einen allokieren Speicher geladen und diesen mit Peek ausgelesen.
(Die Strukturen sind oben beschreiben)
Programm sieht jetzt wie folgt aus:
Code: Alles auswählen
EnableExplicit
Prototype.l Proto_GetDeviceList(*Size.l, *mem.s)
Define lib
Define s$
lib = OpenLibrary(#PB_Any,"C++.dll")
Global GetDeviceList.Proto_GetDeviceList = GetFunction(Lib, "PR_GetDeviceList")
Define Size.l
Define r
Define Buffer.s
Define.l Mem, I, *pMem
Define c.c
buffer = Space(20480)
Mem = AllocateMemory(20480)
If mem
*pMem = mem
EndIf
size = 20480
r = GetDeviceList(@Size,*pmem)
For i = 1 To size
c = PeekC(*pmem)
Debug(Str(i)+": " + Chr(c))
*pmem+1
Next
Die Ausgabe sieht wie folgt aus:
(Habe alles in eine zeile und die einzelnen zeichen in <> gesetzt)
<1><0><0><0>{<0>6<0>B<0>D<0>D<0>1<0>F<0>C<0>6<0>-<0>8<0>1<0>0<0>F<0>-<0>1<0>1<0>D<0>0<0>-<0>B<0>E<0>C<0>7<0>-<0>0<0>8<0>0<0>0<0>2<0>B<0>E<0>2<0>0<0>9<0>2<0>F<0>}<0>\<0>0<0>0<0>0<0>9<0><0><0><0><0><0><0><0><0>
Warum ist hinter jedem Zeichen ein Null-Wert?
Ist dies eine C++-Besonderheit? UniCode? Aus der Dokumentation der dll geht nichts hervor.
Hat jemand eine Idee?
Danke
code-tags gesetzt, ts-soft
Verfasst: 15.03.2007 15:53
von ts-soft
>> Warum ist hinter jedem Zeichen ein Null-Wert?
Ist doch logisch, sind ja WCHAR (Unicode), also mit
auslesen
Würdest Du bitte Code Tags setzen, sieht ja schrecklich aus, wenn Du Code postes

Verfasst: 15.03.2007 16:45
von PBuser
Danke für deine Antwort.
Hatte das Code-Tag nicht gesehen.
