Crear instalador con DVD check?

Iniciado por BerScott, 2 Enero 2015, 23:14 PM

0 Miembros y 1 Visitante están viendo este tema.

BerScott

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.

Eleкtro

#1
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 (inno,21,89,98,99,100,101,102) [Seleccionar]
[Setup]
AppName=My Program
AppVersion=1.0
DefaultDirName={pf}\My Program

[Code]

type
 TDriveType = (
   dtUnknown,
   dtNoRootDir,
   dtRemovable,
   dtFixed,
   dtRemote,
   dtCDROM,
   dtRAMDisk
 );
 
 TDriveTypes = set of TDriveType;
 
 // Las funciones las declaré en modo ANSI.
 
 function GetDriveType(lpRootPathName: string): UINT;
 external 'GetDriveTypeA@kernel32.dll stdcall';
 
 function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: string): DWORD;
 external 'GetLogicalDriveStringsA@kernel32.dll stdcall';

function IntToDriveType(Value: UINT): TDriveType;
begin
 Result := dtUnknown;
 case Value of
   1: Result := dtNoRootDir;
   2: Result := dtRemovable;
   3: Result := dtFixed;
   4: Result := dtRemote;
   5: Result := dtCDROM;
   6: Result := dtRAMDisk;
 end;
end;

function GetLogicalDrives(var ADrives: array of string; AFilter: TDriveTypes): Integer;
var
 S: string;
 I: Integer;
 DriveRoot: string;
begin
 Result := 0;
 SetArrayLength(ADrives, 0);

 I := GetLogicalDriveStrings(0, #0);
 if I > 0 then
 begin
   SetLength(S, I);
   if GetLogicalDriveStrings(Length(S), S) > 0 then
   begin
     S := TrimRight(S);
     I := Pos(#0, S);
     while I > 0 do
     begin
       DriveRoot := Copy(S, 1, I - 1);
       if (AFilter = []) or
         (IntToDriveType(GetDriveType(DriveRoot)) in AFilter) then
       begin
         SetArrayLength(ADrives, GetArrayLength(ADrives) + 1);
         ADrives[GetArrayLength(ADrives) - 1] := DriveRoot;
       end;
       Delete(S, 1, I);
       I := Pos(#0, S);
     end;
     Result := GetArrayLength(ADrives);
   end;
 end;
end;


function CheckForFile(Filename: string; DriveType: TDriveTypes): Boolean;
var
 I: Integer;
 DriveCount: Integer;
 DriveArray: array of string;

begin
 DriveCount := GetLogicalDrives(DriveArray, DriveType);
 for I := 0 to DriveCount - 1 do
   begin
if FileExists(DriveArray[I] + Filename) then
   begin
// MsgBox('File was found on path: ' + DriveArray[I] + Filename, mbInformation, MB_OK);
Result := True;
Break;
end;
end;
end;

function InitializeSetup: Boolean;
begin
 Result := CheckForFile('bin\game.exe', [dtCDROM])
 if Not Result then
begin
MsgBox('File does not exist on any CD-ROM drive, install stops', mbCriticalError, MB_OK);
end;
end;


Saludos[/code]








BerScott

Muchas gracias, de verdad. Esto entonces debería servir para Inno Setup.

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