Paquete del instalador utilizando Inno Configuración -- sql-server campo con windows campo con delphi camp codereview Relacionados El problema

Installer package using Inno Setup


2
vote

problema

Español

Estoy construyendo un paquete de instalación para nuestro software con la configuración de Inno. Como parte de esto, también estoy construyendo algunas DLL diferentes en Delphi XE2 para adaptarse a algunas de las tareas comunes requeridas por el instalador. Uno de ellos es consultar y manipular ajustes en estas instancias. Tengo la intención de apoyar las versiones de SQL 2005 y superior.

Las cosas que necesito para consultar son:

  • Lista de todas las instancias instaladas
  • versiones de todas las instancias instaladas
  • Configuraciones que necesito cambiar (explicadas Siguiente)

Las configuraciones que necesito para cambiar son:

  • habilitar / deshabilitar el protocolo TCP / IP
  • Habilitar / deshabilitar el protocolo de tubos con nombre
  • Cambiar puertos dinámicos de TCP / IP
  • Cambiar el número de puerto de TCP / IP

Lo que entiendo es que se encuentra todo en el Registro, por ejemplo,

SQL Server Config in Registry

Sé que esto también se puede hacer usando WMI, pero prefiero evitar la WMI si es posible. También sé que necesito reiniciar la instancia para aplicar cualquier cambio.

sqlhelper.dll

  library SQLHelper;  uses   System.SysUtils,   System.Classes,   System.Win.Registry,   WinApi.Windows;  {$R *.res}  const   SQL_INSTANCES_KEY = 'SoftwareMicrosoftMicrosoft SQL ServerInstance NamesSQL';    SQL_INST_ROOT_KEY = 'SoftwareMicrosoftMicrosoft SQL Server%sMSSQLServer';  type   TStringArray = array of String;  function Is64BitOS: Bool; stdcall; type   TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; var   hKernel32 : Integer;   IsWow64Process : TIsWow64Process;   IsWow64 : BOOL; begin   Result := False;   hKernel32 := LoadLibrary('kernel32.dll');   try     if (hKernel32 = 0) then RaiseLastOSError;     @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');     if Assigned(IsWow64Process) then begin       IsWow64 := False;       if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin         Result := IsWow64;       end else RaiseLastOSError;     end;   finally     FreeLibrary(hKernel32);   end; end;  function RegAccess: Cardinal; stdcall; begin   Result:= KEY_READ or KEY_WRITE;   if Is64BitOS then     Result:= Result or KEY_WOW64_64KEY; end;  function GetSQLInstanceList(var A: TStringArray): Bool; stdcall; var   R: TRegistry;   L: TStringList;   X: Integer; begin   Result:= False;   SetLength(A, 0);   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(SQL_INSTANCES_KEY) then begin       if R.OpenKey(SQL_INSTANCES_KEY, False) then begin         L:= TStringList.Create;         try           R.GetValueNames(L);           SetLength(A, L.Count);           for X := 0 to L.Count - 1 do begin             A[X]:= L[X];           end;           Result:= True;         finally           L.Free;         end;         R.CloseKey       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceID(const Instance: WideString): WideString; stdcall; var   R: TRegistry; begin   Result:= '';   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(SQL_INSTANCES_KEY) then begin       if R.OpenKey(SQL_INSTANCES_KEY, False) then begin         if R.ValueExists(Instance) then begin           Result:= R.ReadString(Instance);         end;         R.CloseKey       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceExists(const Instance: WideString): Bool; stdcall; begin   Result:= GetSQLInstanceID(Instance) <> ''; end;  function GetSQLInstanceRootKey(const Instance: WideString): WideString; stdcall; begin   Result:= Format(SQL_INST_ROOT_KEY, [GetSQLInstanceID(Instance)]); end;  function GetSQLInstanceVerKey(const Instance: WideString): WideString; stdcall; begin   Result:= GetSQLInstanceRootKey(Instance)+'CurrentVersion'; end;  function GetSQLInstanceConfigKey(const Instance: WideString): WideString; stdcall; begin   Result:= GetSQLInstanceRootKey(Instance)+'SuperSocketNetLib'; end;  function GetSQLInstanceVer(const Instance: WideString): WideString; stdcall; var   R: TRegistry; begin   Result:= '';   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceVerKey(Instance)) then begin       if R.OpenKey(GetSQLInstanceVerKey(Instance), False) then begin         if R.ValueExists('CurrentVersion') then begin           Result:= R.ReadString('CurrentVersion');         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceProtocolEnabled(const Instance, Protocol: WideString): Bool; stdcall; var   R: TRegistry; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+Protocol) then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+Protocol, False) then begin         if R.ValueExists('Enabled') then begin           Result:= R.ReadInteger('Enabled') = 1;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function SetSQLInstanceProtocolEnabled(const Instance, Protocol: WideString;   const Enabled: Bool): Bool; stdcall; var   R: TRegistry;   V: Integer; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+Protocol) then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+Protocol, False) then begin         if R.ValueExists('Enabled') then begin           if Enabled then V:= 1 else V:= 0;           R.WriteInteger('Enabled', V);           Result:= True;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceTCPPort(const Instance: WideString): Integer; stdcall; var   R: TRegistry; begin   Result:= 0;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'TcpIPAll') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'TcpIPAll', False) then begin         if R.ValueExists('TcpPort') then begin           Result:= R.ReadInteger('TcpPort');         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function SetSQLInstanceTCPPort(const Instance: WideString; const Port: Integer): Bool; stdcall; var   R: TRegistry; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'TcpIPAll') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'TcpIPAll', False) then begin         if R.ValueExists('TcpPort') then begin           R.WriteInteger('TcpPort', Port);           Result:= True;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceTCPDynamicPorts(const Instance: WideString): Integer; stdcall; var   R: TRegistry; begin   Result:= 0;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'TcpIPAll') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'TcpIPAll', False) then begin         if R.ValueExists('TcpDynamicPorts') then begin           Result:= R.ReadInteger('TcpDynamicPorts');         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function SetSQLInstanceTCPDynamicPorts(const Instance: WideString; const Port: Integer): Bool; stdcall; var   R: TRegistry; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'TcpIPAll') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'TcpIPAll', False) then begin         if R.ValueExists('TcpDynamicPorts') then begin           R.WriteInteger('TcpDynamicPorts', Port);           Result:= True;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;     exports   Is64BitOS,   RegAccess,   GetSQLInstanceList,   GetSQLInstanceID,   GetSQLInstanceExists,   GetSQLInstanceRootKey,   GetSQLInstanceVerKey,   GetSQLInstanceConfigKey,   GetSQLInstanceVer,   GetSQLInstanceProtocolEnabled,   SetSQLInstanceProtocolEnabled,   GetSQLInstanceTCPPort,   SetSQLInstanceTCPPort,   GetSQLInstanceTCPDynamicPorts,   SetSQLInstanceTCPDynamicPorts;  begin end.   
Original en ingles

I'm building an installer package for our software using Inno Setup. As a part of this, I'm also building a few different DLL's in Delphi XE2 to accommodate for some of the common tasks required by the installer. One of those is querying and manipulating settings on these instances. I intend to support SQL versions 2005 and above.

The things I need to query are:

  • List of all installed instances
  • Versions of all installed instances
  • Settings which I need to change (explained next)

The settings I need to change are:

  • Enable/Disable TCP/IP Protocol
  • Enable/Disable Named Pipes Protocol
  • Change Dynamic Ports of TCP/IP
  • Change Port Number of TCP/IP

What I understand is that this is all found in the registry, for example

SQL Server Config in Registry

I do know this can be done using WMI as well, but I'd rather avoid WMI if at all possible. I also know that I need to restart the instance to apply any changes.

SQLHelper.dll

library SQLHelper;  uses   System.SysUtils,   System.Classes,   System.Win.Registry,   WinApi.Windows;  {$R *.res}  const   SQL_INSTANCES_KEY = 'Software\Microsoft\Microsoft SQL Server\Instance Names\SQL\';    SQL_INST_ROOT_KEY = 'Software\Microsoft\Microsoft SQL Server\%s\MSSQLServer\';  type   TStringArray = array of String;  function Is64BitOS: Bool; stdcall; type   TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; var   hKernel32 : Integer;   IsWow64Process : TIsWow64Process;   IsWow64 : BOOL; begin   Result := False;   hKernel32 := LoadLibrary('kernel32.dll');   try     if (hKernel32 = 0) then RaiseLastOSError;     @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');     if Assigned(IsWow64Process) then begin       IsWow64 := False;       if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin         Result := IsWow64;       end else RaiseLastOSError;     end;   finally     FreeLibrary(hKernel32);   end; end;  function RegAccess: Cardinal; stdcall; begin   Result:= KEY_READ or KEY_WRITE;   if Is64BitOS then     Result:= Result or KEY_WOW64_64KEY; end;  function GetSQLInstanceList(var A: TStringArray): Bool; stdcall; var   R: TRegistry;   L: TStringList;   X: Integer; begin   Result:= False;   SetLength(A, 0);   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(SQL_INSTANCES_KEY) then begin       if R.OpenKey(SQL_INSTANCES_KEY, False) then begin         L:= TStringList.Create;         try           R.GetValueNames(L);           SetLength(A, L.Count);           for X := 0 to L.Count - 1 do begin             A[X]:= L[X];           end;           Result:= True;         finally           L.Free;         end;         R.CloseKey       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceID(const Instance: WideString): WideString; stdcall; var   R: TRegistry; begin   Result:= '';   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(SQL_INSTANCES_KEY) then begin       if R.OpenKey(SQL_INSTANCES_KEY, False) then begin         if R.ValueExists(Instance) then begin           Result:= R.ReadString(Instance);         end;         R.CloseKey       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceExists(const Instance: WideString): Bool; stdcall; begin   Result:= GetSQLInstanceID(Instance) <> ''; end;  function GetSQLInstanceRootKey(const Instance: WideString): WideString; stdcall; begin   Result:= Format(SQL_INST_ROOT_KEY, [GetSQLInstanceID(Instance)]); end;  function GetSQLInstanceVerKey(const Instance: WideString): WideString; stdcall; begin   Result:= GetSQLInstanceRootKey(Instance)+'CurrentVersion\'; end;  function GetSQLInstanceConfigKey(const Instance: WideString): WideString; stdcall; begin   Result:= GetSQLInstanceRootKey(Instance)+'SuperSocketNetLib\'; end;  function GetSQLInstanceVer(const Instance: WideString): WideString; stdcall; var   R: TRegistry; begin   Result:= '';   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceVerKey(Instance)) then begin       if R.OpenKey(GetSQLInstanceVerKey(Instance), False) then begin         if R.ValueExists('CurrentVersion') then begin           Result:= R.ReadString('CurrentVersion');         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceProtocolEnabled(const Instance, Protocol: WideString): Bool; stdcall; var   R: TRegistry; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+Protocol) then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+Protocol, False) then begin         if R.ValueExists('Enabled') then begin           Result:= R.ReadInteger('Enabled') = 1;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function SetSQLInstanceProtocolEnabled(const Instance, Protocol: WideString;   const Enabled: Bool): Bool; stdcall; var   R: TRegistry;   V: Integer; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+Protocol) then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+Protocol, False) then begin         if R.ValueExists('Enabled') then begin           if Enabled then V:= 1 else V:= 0;           R.WriteInteger('Enabled', V);           Result:= True;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceTCPPort(const Instance: WideString): Integer; stdcall; var   R: TRegistry; begin   Result:= 0;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\', False) then begin         if R.ValueExists('TcpPort') then begin           Result:= R.ReadInteger('TcpPort');         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function SetSQLInstanceTCPPort(const Instance: WideString; const Port: Integer): Bool; stdcall; var   R: TRegistry; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\', False) then begin         if R.ValueExists('TcpPort') then begin           R.WriteInteger('TcpPort', Port);           Result:= True;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function GetSQLInstanceTCPDynamicPorts(const Instance: WideString): Integer; stdcall; var   R: TRegistry; begin   Result:= 0;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\', False) then begin         if R.ValueExists('TcpDynamicPorts') then begin           Result:= R.ReadInteger('TcpDynamicPorts');         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;  function SetSQLInstanceTCPDynamicPorts(const Instance: WideString; const Port: Integer): Bool; stdcall; var   R: TRegistry; begin   Result:= False;   R:= TRegistry.Create(RegAccess);   try     R.RootKey:= HKEY_LOCAL_MACHINE;     if R.KeyExists(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\') then begin       if R.OpenKey(GetSQLInstanceConfigKey(Instance)+'Tcp\IPAll\', False) then begin         if R.ValueExists('TcpDynamicPorts') then begin           R.WriteInteger('TcpDynamicPorts', Port);           Result:= True;         end;         R.CloseKey;       end;     end;   finally     R.Free;   end; end;     exports   Is64BitOS,   RegAccess,   GetSQLInstanceList,   GetSQLInstanceID,   GetSQLInstanceExists,   GetSQLInstanceRootKey,   GetSQLInstanceVerKey,   GetSQLInstanceConfigKey,   GetSQLInstanceVer,   GetSQLInstanceProtocolEnabled,   SetSQLInstanceProtocolEnabled,   GetSQLInstanceTCPPort,   SetSQLInstanceTCPPort,   GetSQLInstanceTCPDynamicPorts,   SetSQLInstanceTCPDynamicPorts;  begin end. 
        
         
         

Lista de respuestas


Relacionados problema

2  ¿Los convertidores / reverters de Marshalling a través de polimorfismo realistas?  ( Is marshalling converters reverters via polymorphism realistic ) 
Actualmente estoy en proceso de limpiar las partes finales de esta pregunta Aquí . ¿Voy a hacer esto lo incorrecto / podría hacerse más inteligente (quizás...

1  Calcular y hacer una base de datos de números primos  ( Calculate and make a database of prime numbers ) 
Recientemente creé un programa para encontrar un número primo. Está funcionando muy bien y hacerlo muy rápido, pero me preguntaba si puedes ayudarme a hacerlo...

9  Parámetro más rápido que pasa en Delphi 7?  ( Fastest parameter passing in delphi 7 ) 
Bloqueado . Esta pregunta y sus respuestas son bloqueadas porque la pregunta es off-topic pero tiene importancia histórica. Actualmente no está a...

4  Eventos anónimos en Delphi  ( Anonymous events in delphi ) 
Escribí un creador de eventos anónimos. Me gustaría preguntar si alguien puede decirme si lo hice el "derecho" o "mejor", o cómo podría hacerlo mejor. aquí ...

2  Analizando el código fuente de una página para las URL  ( Parsing a pages source code for urls ) 
Mi código tiene que descargar el código fuente de una página y analizarla para URL. Quiero que solicite el número que se incrementa dentro de la sección críti...

1  Sugerencias de mejora, manejo de los eventos de mouseleve / mouseleave para objetos creados dinámicamente  ( Suggestions for improvement handling mouseenter mouseleave events for dynamic ) 
Versión de prueba de mi código para el manejo de eventos individuales de mouseEnter / Mouseleave para objetos creados dinámicamente. El código emula un carrit...

1  Función genérica para cargar una función de una biblioteca DLL  ( Generic function for loading a function from a dll library ) 
Estoy tratando de escribir una función genérica para cargar una función de una biblioteca DLL. De ninguna manera soy un experto en DLL, es por eso que pregunt...

6  Producir una matriz de cuerdas de una sola cadena  ( Produce an array of strings from a single string ) 
Tengo una función que lee una cadena como esta (AnimalCount+HumanCount) y el resultado de esta función es una matriz de cadenas [ "(" , "AnimalCount...

3  Tstickylabel Controla a cualquiera?  ( Tstickylabel control anyone ) 
Me inspiré con esta pregunta ¿Cómo puedo detectar cuando otros cambios lo cambian límites? y @remy lebeau la respuesta y decidió escribir mi propio control ...

3  ¿Es esta la forma correcta de proteger un objeto?  ( Is this the right way to thread protect an object ) 
Escribí una Preguntas frecuentes sobre un sitio web de terceros que pertenece a los objetos de protección contra roscas en Delphi. Lo que me gustaría saber es...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos