Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: BerScott en 2 Enero 2015, 23:14 pm



Título: Crear instalador con DVD check?
Publicado por: BerScott en 2 Enero 2015, 23:14 pm
Hola a todos.

Estoy intentando buscar respuesta para esto desde hace ocho meses. En un intento desesperado estoy registrándome en varios foros de programación y derivados a ver si alguien puede despejarme esta duda. No he encontrado un foro mas específico para esto, así que espero que este planteando la duda en la sección correcta.

Llevo como ocho meses intentando documentarme para poder crear un instalador para Windows, salvo con la excepción de que este requiere comprobar si en la bandeja del lector hay un disco insertado, en concreto el de un juego, ya que soy modder y por circunstancias varias necesito que el instalador reconozca el disco original para continuar instalando los archivos.

La operación en si es sencilla, si el disco es el correcto el instalador continua y vuelca los archivos en las carpetas correspondientes, si no es el disco correcto el instalador preguntará si quieres volver a intentarlo o salir del instalador.

Por ahora lo he intentado con InstallShield 2010 Premiere y con Inno Setup Compiler, pero no doy con la tecla. En los foros oficiales no me ha respondido absolutamente nadie y gente que ha creado algo por el estilo tampoco contestan a emails/contactos por foro.

A titulo informativo: no tengo apenas conocimientos en programación, solo algo de scripting para algunos programas concretos.

Esto ya es desesperado. Agradecería infinitamente que alguien arrojara algo de luz.

Un saludo.


Título: Re: Crear instalador con DVD check?
Publicado por: Eleкtro en 3 Enero 2015, 07:58 am
En ambos podrías hacerlo, MSI soporta VisualBasic Scripting, e IS soporta Pascal Scripting, ahora, yo no manejo MSI (aunque si manejo VBS, pero desconozco como implementarlo usando la sintaxis de MSI).

Se me ocurren dos formas, una sería comprobando la etiqueta del disco ...en caso de que el cd llevase una etiqueta igual para cada copia del juego,
y otra forma sería verificando la existencia de un archivo crítico dentro del disco (juego.exe) ...y a raíz de esto puedes hacer también un análisis del checksum/hash (CRC32/MD5) para mayor fiabilidad, o las cosas que quieras.

Ejemplo:

Código
  1. [Setup]
  2. AppName=My Program
  3. AppVersion=1.0
  4. DefaultDirName={pf}\My Program
  5.  
  6. [Code]
  7.  
  8. type
  9.  TDriveType = (
  10.    dtUnknown,
  11.    dtNoRootDir,
  12.    dtRemovable,
  13.    dtFixed,
  14.    dtRemote,
  15.    dtCDROM,
  16.    dtRAMDisk
  17.  );
  18.  
  19.  TDriveTypes = set of TDriveType;
  20.  
  21.  // Las funciones las declaré en modo ANSI.
  22.  
  23.  function GetDriveType(lpRootPathName: string): UINT;
  24.  external 'GetDriveTypeA@kernel32.dll stdcall';
  25.  
  26.  function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: string): DWORD;
  27.  external 'GetLogicalDriveStringsA@kernel32.dll stdcall';
  28.  
  29. function IntToDriveType(Value: UINT): TDriveType;
  30. begin
  31.  Result := dtUnknown;
  32.  case Value of
  33.    1: Result := dtNoRootDir;
  34.    2: Result := dtRemovable;
  35.    3: Result := dtFixed;
  36.    4: Result := dtRemote;
  37.    5: Result := dtCDROM;
  38.    6: Result := dtRAMDisk;
  39.  end;
  40. end;
  41.  
  42. function GetLogicalDrives(var ADrives: array of string; AFilter: TDriveTypes): Integer;
  43. var
  44.  S: string;
  45.  I: Integer;
  46.  DriveRoot: string;
  47. begin
  48.  Result := 0;
  49.  SetArrayLength(ADrives, 0);
  50.  
  51.  I := GetLogicalDriveStrings(0, #0);
  52.  if I > 0 then
  53.  begin
  54.    SetLength(S, I);
  55.    if GetLogicalDriveStrings(Length(S), S) > 0 then
  56.    begin
  57.      S := TrimRight(S);
  58.      I := Pos(#0, S);
  59.      while I > 0 do
  60.      begin
  61.        DriveRoot := Copy(S, 1, I - 1);
  62.        if (AFilter = []) or
  63.          (IntToDriveType(GetDriveType(DriveRoot)) in AFilter) then
  64.        begin
  65.          SetArrayLength(ADrives, GetArrayLength(ADrives) + 1);
  66.          ADrives[GetArrayLength(ADrives) - 1] := DriveRoot;
  67.        end;
  68.        Delete(S, 1, I);
  69.        I := Pos(#0, S);
  70.      end;
  71.      Result := GetArrayLength(ADrives);
  72.    end;
  73.  end;
  74. end;
  75.  
  76.  
  77. function CheckForFile(Filename: string; DriveType: TDriveTypes): Boolean;
  78. var
  79.  I: Integer;
  80.  DriveCount: Integer;
  81.  DriveArray: array of string;
  82.  
  83. begin
  84.  DriveCount := GetLogicalDrives(DriveArray, DriveType);
  85.  for I := 0 to DriveCount - 1 do
  86.    begin
  87. if FileExists(DriveArray[I] + Filename) then
  88.    begin
  89. // MsgBox('File was found on path: ' + DriveArray[I] + Filename, mbInformation, MB_OK);
  90. Result := True;
  91. Break;
  92. end;
  93. end;
  94. end;
  95.  
  96. function InitializeSetup: Boolean;
  97. begin
  98.  Result := CheckForFile('bin\game.exe', [dtCDROM])
  99.  if Not Result then
  100. begin
  101. MsgBox('File does not exist on any CD-ROM drive, install stops', mbCriticalError, MB_OK);
  102. end;
  103. end;

Saludos[/code]


Título: Re: Crear instalador con DVD check?
Publicado por: BerScott en 3 Enero 2015, 22:58 pm
Muchas gracias, de verdad. Esto entonces debería servir para Inno Setup.

Ire haciendo pruebas con ese codigo y a ver que tal  :)