Getting a string from Windows registry

BlitzMax Forums/BlitzMax Programming/Getting a string from Windows registry

taxlerendiosk(Posted 2005) [#1]
I've been looking into advapi32.dll's registry functions and have got as far as opening a key and querying the value, but of course I can't access the buffer that it puts the string into because it's in forbidden memory space. So how do I get it?

This is what I have (trying to get the path of the associated application for .NES files, but that's not important, it's just a test:)
Strict

Import "-ladvapi32"

Extern "Win32"
	Function RegOpenKeyExA:Int(hKeyParent:Int, SubKey$z, MustBeZero:Int, AccessMask:Int, ..
				phkResult:Int Var)
	
	Function RegQueryValueExA(	hKey:Int, ..
								lpValueName$z, ..
  								MustBeNull:Int, ..
  								DataType:Int Var, ..
								lpData:Byte Ptr Var, ..
								BufferSize:Int Var)
			
	Function RegCloseKey:Int(hKey:Int)
End Extern

Const HKEY_CLASSES_ROOT:Long = $80000000
Const KEY_READ = $20019
Const ERROR_SUCCESS = 0

Local nesAutoFileKey:Int

If RegOpenKeyExA( HKEY_CLASSES_ROOT, "nes_auto_file\shell\open\command", ..
		0, KEY_READ, nesAutoFileKey) = ERROR_SUCCESS

	Print "Key " + nesAutoFileKey + " opened successfully!"

	Local DataSize:Int = 1000
	Local Data:Byte Ptr = MemAlloc(DataSize)
	Local DataType:Int

	If RegQueryValueExA( nesAutoFileKey, "", Null, DataType, Data, DataSize) = ERROR_SUCCESS
		
		Print "Value queried successfully!"
		Print "Data length: " + DataSize
		
		Local Stream:TStream = CreateRamStream(Data,DataSize,1,0)
		
		Print ReadLine(Stream)
		
		CloseStream(Stream)
		
		MemFree Data
		
		RegCloseKey(nesAutoFileKey)
	End If
	
End If



Eric Guo(Posted 2005) [#2]
Delete "Var" from "lpData:Byte Ptr Var, .." in "RegQueryValueExA" function