Seite 2 von 3

Verfasst: 03.02.2007 22:30
von Toshy
@ts-soft
Was macht da denn den Unterschied? Unter Struktur in der Hilfe steht nur "[]" und ich dachte das diese Eckigen klammern die "statischen Arrays" sind die in der Hilfe angemerkt sind. und die normalen mit DIM erstellten Arrays die runde Klammer "()" nutzen. Was ist denn nun "{}" in Bezug auf dies?

Auf der MSDN-Seite findet man zu der Struktur SP_DEVICE_INTERFACE_DETAIL_DATA
( http://msdn2.microsoft.com/en-us/library/aa363463.aspx )
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA {
DWORD cbSize;
TCHAR DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA,
*PSP_DEVICE_INTERFACE_DETAIL_DATA;

Members

cbSize
Size of the structure, in bytes. The caller must set this member to sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA).
DevicePath
Pointer to a NULL-terminated string that specifies the device path.

Requirements
Bisher habe ich es leider noch nicht ganz geschaft die Funktion
SetupDiGetDeviceInterfaceDetail
( http://msdn2.microsoft.com/en-us/library/aa363455.aspx )
richtig zum laufen zu bekommen.
richtig zum laufen zu bringen. Irgendwie verstehe ich nicht ganz wie ich am besten den Speicher reserviere, natürlich auch in der richtigen Größe ;-)

Verfasst: 03.02.2007 22:40
von ts-soft
>> Was macht da denn den Unterschied?

Code: Alles auswählen

Structure beispiel
  text1.s[1] ; Stringpointerarray, 1 element
  text2.s{1} ; String, 1 Zeichen lang, fix (kein Pointer)
  text3.c[1] ; char, 1 element a 1 oder 2 Byte (ANSI oder Unicode)
  text4.c[0] ; wie oben, undefiniert, any
EndStructure
Ich hoffe mal, das ist so richtig.

Verfasst: 03.02.2007 22:47
von Toshy
aha.
Bist auf
text4.c[0] ; wie oben, undefiniert, any
habe ich das verstanden.
Wie kann in einer Struktur etwas undefiniert sein?
wenn ich nun

Code: Alles auswählen

Structure beispiel
   text4.c[0] ; wie oben, undefiniert, any
   text4b.l ; nur so zum test und Verständis
   text5.c[0] ; wie oben, undefiniert, any
   text6.c[0] ; wie oben, undefiniert, any
EndStructure
nehmen würde, was würde das real bewirken?

Verfasst: 03.02.2007 22:52
von edel
versuch es mal so :

Code: Alles auswählen

Structure SP_DEVICE_INTERFACE_DETAIL_DATA
  cbSize.l
  DevicePath.s  
EndStructure
edit : ups , cbSize ist natuerlich kein string :D

Verfasst: 03.02.2007 22:58
von ts-soft

Code: Alles auswählen

Structure beispiel
   text4.c[0] ; wie oben, undefiniert, any
   text4b.l ; nur so zum test und Verständis
   text5.c[0] ; wie oben, undefiniert, any
   text6.c[0] ; wie oben, undefiniert, any
EndStructure

test.beispiel
test\text4.c = AllocateMemory(9 * SizeOf(Character))

PokeS(@test\text4.c, "PureBasic", 9 * SizeOf(Character))

Debug Chr(test\text4[4])

Verfasst: 04.02.2007 03:07
von Toshy
@edel
werde es mal versuchen
@ts-soft

Code: Alles auswählen

test.beispiel
test\text4.c = AllocateMemory(9 * SizeOf(Character))

PokeS(@test\text4.c, "PureBasic", 9 * SizeOf(Character))

Debug Chr(test\text4[4]) 
Das kann doch eigendlich nicht gehen,oderdoch ?
Wenn in der Strukturdefinition ".c[0] steht, ist das nun nur ein Char in länge null, der direkt in der Struktur steht oder ein Pointer der halt noch auf Null gesetzt ist? Entsprechend den Eckigen Klammern in einer Struktur dürfte es erstes sein, also direkt in der Struktur stehen, was leider soweit ich die Funktion und Struktur von SP_DEVICE_INTERFACE_DETAIL_DATA verstehe nicht sein soll (da steht ja was von Pointer). Aber wenn es nun so ist wie duoben schreibst, dann erhälst du mit AllocateMemory einen Speicherbereich, allerdings wird in test\text4.c doch nur der Pointer geschrieben (den man ja durch AllocateM zurück erhält).
"@" Gibt ja eine Adresse zurück, normal ja die einer Funktion oder ähnlichem, gibt @test\text4.c nun einfach nur die Adresse von test\text4 wieder oder den Pointer den man eingefügt hat.
wenn es nun kein .c, sondern ein .l oder *Pointer wäre, dann würde ich das so so machen:

Code: Alles auswählen

PokeS(test\text4.l, "PureBasic", 9 * SizeOf(Character))

Ich vermute ja, das dein Beispiel korrekt ist und damit zu tun hat, das du das Char undifiniert gelassen hast. Aber da ich das so nicht kenne, wollte ich da lieber noch mal nachfragen. Denn das man mit PoksS auch schreiben kann, wenn das nicht stimmt ist klar, halt bis es zu einem IMA (jetzt weiß ich ja was das heißt) kommt.

So oder so werde ich damit allem mal ein bissl rumtesten.
Druß Toshy

Verfasst: 04.02.2007 04:56
von edel
DevicePath ist ein Zeiger auf einen normalen PBString.
MSDN hat geschrieben: DevicePath
Pointer to a NULL-terminated string that specifies the device path.

Verfasst: 04.02.2007 05:02
von Toshy
Oh, auch noch wach, oder schon wieder wach :-)
Ich weiß, das habe ich auch gelesen und daher auch schon mit DevicePath.s getestet, aber ich bekomme es nicht hin.
OBen drüber steht ja dazu auch nicht
TCHAR DevicePath[ANYSIZE_ARRAY];
Was auch immer damit gemeint sein soll.

Ich suche gerade im Internet nach Seiten wo der selbe Rückgabewert angegeben ist. Mal schauen, was ich da noch so finde.

Verfasst: 04.02.2007 05:13
von edel
immer noch, hab Urlaub ...

Hast du denn schon etwas Code fertig, mag jetzt nix neues schreiben ? :D

Verfasst: 04.02.2007 05:23
von Toshy
[hatte dies schon vor stunden geschrieben, nur vergessen abzuschicken :-(]
Also ich gebe es langsam auf. Ich schaffe es einfach nicht, den Teil mit SetupDiGetDeviceInterfaceDetail zum laufen zu bekommen. SetupDiGetDeviceInterfaceDetail muß zweimal aufgerufen werden, das erst mal klappt und es wird die Benötigte Buffergröße übergeben, aber diesen korrekt zu erstellen und auszulesen klappt nicht.
Ich bekomme beim zweiten Aufruf immer #ERROR_INVALID_USER_BUFFER zurück.
Ich erstelle den Buffer nun mit

Code: Alles auswählen

         *pdidd.SP_DEVICE_INTERFACE_DETAIL_DATA = AllocateMemory(SizeOf( SP_DEVICE_INTERFACE_DETAIL_DATA) + cbRequired * SizeOf(Character) + 1)
den DevicePath in der STruktur habe ich mit .c und .s und jeweils mit [0] und [1] und mehr getestet.

Ich komme echt nicht weiter. Es wird vermutlich nur ein relativ kleiner Fehler sein, aber ich verstehe nicht was ich da noch machen könnte.

Code: Alles auswählen

ReturnSetupDiGetDeviceInterfaceDetail =  SetupDiGetDeviceInterfaceDetail(hdev,@ll_did(),*pdidd,cbRequired,@cbRequired,0)
geht auch nicht (ohne @)