String Pointer?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

#Reaper

Newsposter

Betreff: String Pointer?

BeitragDi, Feb 12, 2008 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versuche zur Zeit WinAPI-Funktionen für die Registry (Sry nochmals BtbN Wink) in BMax einzubinden.
Funktioniert auch soweit alles, nur verwende ich bislang für die Strings, welche ich z.B. von RegEnumValues() erhalte, keine Strings, sondern Banks.
Habe es aber noch nicht hinbekommen, einen Pointer zu einem String zu übergeben, ohne das RegEnumValues() irgendeinen Fehler zurückgibt. BMax bringt mir aber (leider) keinen Fehler.
Oder sind Pointer-Strings nicht möglich?

MfG
#Reaper
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

mahe

BeitragDi, Feb 12, 2008 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
RegEnumValues() erwartet wahrscheinlich ein Char-Array und die Strings in BMax sind irgendwelche Objekte.
Also nicht kompatibel.
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

FOODy

BeitragDi, Feb 12, 2008 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du die Funktionen von der WinApi in 'nem Extern-Block deklarierst, verwendest du für die Stringparameter den "Typ" $z anstelle von :String bzw $?

z.B.:
Code: [AUSKLAPPEN]
Extern
    Function IchErwarteEinString(string_$z)
EndExtern


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

#Reaper

Newsposter

BeitragDi, Feb 12, 2008 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, die Extern-Deklaration hab ich ganz vergessen Embarassed

Vorher war bei lpValueName ein Byte-Pointer, habe das nun mal so geändert:

Code: [AUSKLAPPEN]
Function RegEnumValue:Int(hKey:Int, dwIndex:Int, lpValueName$z, lpcchValueName:Byte Ptr, Reserved:Int, lpType:Byte Ptr, lpData:Byte Ptr, lpcchData:Byte Ptr)="RegEnumValueA@32"


Und übergebe nun mal so:
Code: [AUSKLAPPEN]
RegEnumValue( hKey, dwIndex, ValueBnk, Varptr(ValueSizeBnk), 0, Varptr(lpType), BankBuf(DataBnk), Varptr(DataSizeBnk) )


Geht leider auch nicht. ValueBnk bleibt leer. Habe schon mehrere kombinationen ausprobiert, kenne mich da leider noch nicht so sehr aus. (Pointer)

Msdn sagt zu den Variablen folgendes:
Zitat:
LONG WINAPI RegEnumValue(
__in HKEY hKey,
__in DWORD dwIndex,
__out LPTSTR lpValueName,
__inout LPDWORD lpcchValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);


Danke schonmal für eure Hilfe! Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

ChristianK

BeitragDi, Feb 12, 2008 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Für den String "lpValueName" muss vorher schon Speicher reserviert worden sein. Deshalb würde ich nicht $z, sondern Byte Ptr verwenden und ein einfaches Byte-Array von z.B. 1024 an die Funktion übergeben und danach das Array in einen BlitzMax-String umwandeln.

Code: [AUSKLAPPEN]
Local str:String = String.FromCString( bytes )

Der Fehler könnte aber natürlich auch wo anders liegen. Vielleicht kannst du noch ein bisschen mehr vom Code zeigen ... Smile
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

#Reaper

Newsposter

BeitragDi, Feb 12, 2008 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Immer wollen sie gleich alle den Code^^ Wink

Also, meintest du das so:

Code: [AUSKLAPPEN]

Local   ValueBnk      :Byte[1024]                  , ..
         ValueSizeBnk   :Int      = 1024            , ..
         DataBnk         :TBank      = Null            , ..
         DataSizeBnk      :Int      = 1024            , ..                  
         Error         :Int      = 0   
   
   
   'ValueBnk   = CreateBank(1024)
   DataBnk      = CreateBank(1024)
   
   Error   = RegEnumValue( hKey, dwIndex, Varptr(ValueBnk), Varptr(ValueSizeBnk), 0, Varptr(lpType), BankBuf(DataBnk), Varptr(DataSizeBnk) )
   
   Print String.fromCString(ValueBnk)'""


Und die externe Funktion:
Code: [AUSKLAPPEN]
Function RegEnumValue:Int(hKey:Int, dwIndex:Int, lpValueName:Byte Ptr, lpcchValueName:Byte Ptr, Reserved:Int, lpType:Byte Ptr, lpData:Byte Ptr, lpcchData:Byte Ptr)="RegEnumValueA@32"


Funktioniert aber leider auch wieder nicht, RegEnumValue() gibt einen Fehler (von sich aus, nicht BMax-Compiler) zurück.

PS: Naja, mehr Code braucht man eigentlich nicht unbedingt Wink
Btw: Ging ja auch vorher mit ValueBnk als Bank und Übergabe mit BankBuf(), wollte nur wenn möglich es nicht so B3D-like machen Wink
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

ChristianK

BeitragDi, Feb 12, 2008 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, so in etwa hab ich's mir gedacht. Nur beim 3. Parameter ohne Varptr, sonst bekommst du einen Zeiger auf einen Zeiger. Arrays werden nämlich schon von sich aus als Ptr behandelt.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

#Reaper

Newsposter

BeitragDi, Feb 12, 2008 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, ubs, ok, wuste ich nicht. Embarassed
Funktioniert, super, danke! Very Happy
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group