Akkus erkennen & SYSTEM_POWER_STATUS vs.SYSTEM_BATTERY_S

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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 ;-)
1. Win10
PB6.1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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?
1. Win10
PB6.1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Zuletzt geändert von edel am 03.02.2007 22:59, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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])
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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
1. Win10
PB6.1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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.
1. Win10
PB6.1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

immer noch, hab Urlaub ...

Hast du denn schon etwas Code fertig, mag jetzt nix neues schreiben ? :D
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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 @)
1. Win10
PB6.1
Antworten