Thursday, April 17, 2008

How to enumerate local 64 bit SQL Instances from Delphi

Hi,
      In order to access 64-bit registry from 32 bit applications, KEY_WOW64_64KEY is to be used with the RegOpenKeyEx method as shown in the below example.

Delphi Version : 2006
Sql Version     : 2005 x64

//  Look in registry for version

const
KEY_WOW64_64KEY = $0100;

procedure Fetch64BitInstalledInstances(slInstanceNames: TStringList);
const
  sSQLKey = 'SOFTWARE\Microsoft\Microsoft Sql Server';
  sInstalledInstancesValue = 'InstalledInstances';
var
  key: HKEY;
  p, buffer: PChar;
  valueLen : integer;
begin
  if not Assigned(slInstanceNames) then
    slInstanceNames := TStringList.Create
  else
    slInstanceNames.Clear;
  if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
                         PChar(sSQLKey),
                         0, 
                         KEY_QUERY_VALUE or KEY_WOW64_64KEY, 
                         key) = ERROR_SUCCESS then
  begin
    GetMem(buffer, valueLen);
    try
      RegQueryValueEx(key, 
                              PChar(sInstalledInstancesValue),
                              nil,
                              nil,
                              PBYTE(buffer),
                              @valueLen);
      p  := buffer;
      while (p^ <> #0) do
      begin
        slInstanceNames.Add(p);
        Inc(p, lstrlen(p) + 1)
      end
    finally
      FreeMem(buffer)
    end
  end;
end;

0 comments: