Hi, >From: Daniel Berger <djberg96 / gmail.com> >Reply-To: ruby-talk / ruby-lang.org >To: ruby-talk / ruby-lang.org (ruby-talk ML) >Subject: Oddity with Win32API, RegQueryValueEx >Date: Mon, 15 May 2006 18:45:19 +0900 > >Hi all, > >Ruby 1.8.4 >Windows XP > >I noticed something curious when using the RegQueryValueEx() function using >straight C versus a Win32API wrapper. Whenever I call it via Win32API, it >always returns ERROR_MORE_DATA (i.e. value 234) on the first call, not >matter what I set the buffer size to. > >Here's a sample C program that works fine: > >#include <windows.h> >#include <stdio.h> > >int main(){ > char* key = >"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\SNDSrvc"; > char* val = "EventMessageFile"; > char buf[1024]; > DWORD size; > int rv; > HKEY hk; > > rv = RegOpenKeyEx( > HKEY_LOCAL_MACHINE, > key, > 0, > KEY_READ, > &hk > ); > > if(rv == ERROR_SUCCESS){ > rv = RegQueryValueEx(hk, val, NULL, NULL, buf, &size); > if(rv == ERROR_SUCCESS){ > printf("Success!\n"); > printf("Size: %i\n", size); > printf("Buf: %s\n", buf); > RegCloseKey(hk); > } > else{ > printf("Failure: %i\n", GetLastError()); > } > } > > return 0; >} > >However, the equivalent Ruby program always returns ERROR_MORE_DATA: > >require 'Win32API' > >HKEY_LOCAL_MACHINE = 0x80000002 >KEY_READ = 0x20019 > >RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'L', 'L') >RegOpenKeyEx = Win32API.new('advapi32', 'RegOpenKeyEx', 'LPLLP', 'L') >RegQueryValueEx = Win32API.new('advapi32', 'RegQueryValueEx', 'LPLPPP', >'L') > >val = 'EventMessageFile' >key = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\SNDSrvc" >hk = [0].pack('L') > >if RegOpenKeyEx.call(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, hk) == 0 > hk = hk.unpack('L').first > buf = 0.chr * 1024 > size = 0.chr * 4 should be size = [buf.length].pack('L') > > p RegQueryValueEx.call(hk, val, 0, 0, buf, size) # 234 >end > >The size checks out at 58 (as it does in the C program), so I don't >understand why I'm getting a 234 back. It's not a huge deal, mind you, >since I can just call it again, but I thought it was odd. > size is [in, out] pointer to a variable that specifies the size, in bytes, of the buffer pointed to by the buf parameter Regards, Park Heesob