PDA

Ver la Versión Completa : Problemas con Inno Setup ,con alias y DBE


David
10-10-2006, 18:34:15
Tengo ya el inno setup , pero tengo dos dudas , una es cuando instalo , si esta el BDE Administrator , que no lo instale , es decir que detecte si esta y si no esta que lo instale y la otra es añadir los alias según el directorio donde instale el usuario el programa .

Mi programa tiene dos alias , que estan en dos carpetas distintas , dentro de donde está instalado el programa .

He mirado , en la web de Inno , aquí :

http://www.jrsoftware.org/iskb.php?bde

Me dice , que añada el programa Minireg.exe , pero claro no me explica , lo que he dicho yo , de instalar si esta o no esta el BDE .

En cuanto a los alias , te dice que añadas un programa realizado en Delphi , llamado AddAlias.exe , pero este programa , no te instala los alias en el lugar elegido por el usuario para instalar el programa . Además mi programa tiene dos alias , habría que ver como resuelvo este problema .

De todo lo que he dicho , lo que más me interesa , es instalar los alias .

Un saludo

roman
10-10-2006, 18:47:46
Bueno, según yo entiendo, usas AddAlias por cada alias que quieras instalar pasando como parámetro la ruta:


[run]
AddAlias mi_alias c:\ruta\al\directorio paradox
AddAlias mi_otro_alias c:\ruta\al\otro\directorio paradox


No lo he probado, pero imagino que en la sección [run] puedes hacer uso de las constantes de la instalación, tales como {app} (directorio de instalación):


[run]
AddAlias mi_alias {app}\subdirectorio\de\tablas paradox


// Saludos

roman
10-10-2006, 18:51:58
Mmm... La sintaxis es incorrecta. Sería más bien así:


[run]
Filename: "{tmp}\AddAlias.exe"; Parameters: """{app}\subdirectorio"""


// Saludos

David
12-10-2006, 16:56:10
Mmm... La sintaxis es incorrecta. Sería más bien así:


[run]
Filename: "{tmp}\AddAlias.exe"; Parameters: """{app}\subdirectorio"""


// Saludos

Pero con esta sintaxis , donde pongo los alias ?

roman
12-10-2006, 17:59:26
Acabo de probarlo y así me funciona:


[Run]
Filename: "{tmp}\AddAlias.exe"; Parameters: "mi_alias ""{app}\tablas"" PARADOX"


Observa las comillas alrededor de {app}\tablas. Si las omites parece que no funciona.

// Saludos

David
13-10-2006, 21:25:54
No me sale , no sé donde esta el error , pero no me sale , pongo todo el código a ver si alguien ve donde este el error .

compila bien , instala el programa , pero no instala los alias .


; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
AppName=Miprograma
AppVerName=Miprograma1.5
DefaultDirName={pf}\Miprograma
DefaultGroupName=Miprograma
DisableProgramGroupPage=yes
OutputDir=C:\My InstallShield Express Projects
OutputBaseFilename=Miprograma
SetupIconFile=C:\Miprograma.ico
Compression=lzma
SolidCompression=yes

[Languages]
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Miprograma\Miprograma.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Miprograma\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "AddAlias.exe"; DestDir: "{tmp}"

; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Miprograma"; Filename: "{app}\Miprograma.exe"
Name: "{group}\{cm:UninstallProgram,Miprograma}"; Filename: "{uninstallexe}"
Name: "{userdesktop}\Miprograma"; Filename: "{app}\Miprograma.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\Miprograma.exe"; Description: "{cm:LaunchProgram,Miprograma}"; Flags: nowait postinstall skipifsilent
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias1""{app}""PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias2""{app}\tablas""PARADOX"

David
13-10-2006, 21:44:04
Ya me sale , habia que poner un poco de espacio entre las comillas , las que estan detras de cada alias y un espacio delante de la palabra PARADOX.


Filename: "{tmp}\AddAlias.exe"; Parameters: "alias1 ""{app}"" PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "alias2 ""{app}\tablas"" PARADOX"


Ya sé que este programa es gratis , pero por dejar un pequeño espacio dentro de unas comillas , no deberia de ser motivo para que no funcione una aplicación , me he estado toda la tarde dandole vueltas por este aparentemente insignificante detalle .

Otro detalle de la aplicación , es que no desinstala los alias , al desinstalar el programa , y si desinstala el programa y lo instalas de nuevo , en otro directorio , pues no te actualiza la ruta de los alias .

egostar
13-10-2006, 22:10:08
Otra opción que tienes es la siguiente:


[Run]
Filename: "{app}\AddAlias.exe"; Parameters: "MIBASE {app}\tables PARADOX"


Sin tantas comillas, recuerda que estas pasando parametros en la linea de comandos.


Otro detalle de la aplicación , es que no desinstala los alias , al desinstalar el programa , y si desinstala el programa y lo instalas de nuevo , en otro directorio , pues no te actualiza la ruta de los alias


Pues si se puede borrar agregando un signo - al Alias


Filename: "{app}\AddAlias.exe"; Parameters: "-MIBASE"


Y también hay que modificar el programa AddAlias.

Aqui pego la modificación


DbiInit(nil);
try
if FDelete then
try
DbiDeleteAlias(nil, PChar(GAlias));
except
end
else // Este else no esta en el original.
try
DbiAddAlias(nil, PChar(StrToOem(GAlias)),
PChar(StrToOem(FDrvName)),
PChar(FParams), True);
DbiCfgSave(nil, nil, True);
except
end;
finally
DbiExit();
end;



Saludos

roman
13-10-2006, 22:23:29
Sin tantas comillas, recuerda que estas pasando parametros en la linea de comandos.

Las comillas son necesarias porque la ruta {app} pudiera tener espacios (como en C:\Archivos de programa\Mi App). Justamente por eso es que el espacio que menciona David no es una cuestión del InnoSetup sino de como se pasan los parámetros a un ejecutable en Windows.

Muy buena la adición de cómo borrar alias. No estoy seguro, pero me parece que InnoSetupo permite especificar que eso se ejecuta al desinstalar el programa, ¿es así?

// Saludos

egostar
13-10-2006, 22:24:11
Se me pasó, tambien puedes hacer que se ejecute cuando desinstalas la aplicación usando lo siguiente:


[UninstallRun]
Filename: Addalias.exe; Parameters: "-MIBASE"



Saludos.

roman
13-10-2006, 22:27:55
¡Ah! Pues con esto ya queda bien redondito :) Creo que este hilo es el hilo a citar para futuras referencias respecto a la instalación del BDE.

// Saludos

egostar
13-10-2006, 22:30:36
Las comillas son necesarias porque la ruta {app} pudiera tener espacios (como en C:\Archivos de programa\Mi App). Justamente por eso es que el espacio que menciona David no es una cuestión del InnoSetup sino de como se pasan los parámetros a un ejecutable en Windows.

Creo que tienes razón, yo normalmente no uso directorios con espacios, buen punto.

Otra cosa que les recomiendo es usar otra herramienta que va de la mano con InnoSetup y se llama ISTool (http://www.istool.org/default.aspx/)

Te crea el mismo archivo que usa InnoSetup pero desde una interfaz gráfica.

Saludos.

egostar
14-10-2006, 02:46:24
Me dice , que añada el programa Minireg.exe , pero claro no me explica , lo que he dicho yo , de instalar si esta o no esta el BDE .


Para complementar este tema y evitar que se instale de nuevo el BDE si ya existe, modifique el programa MiniReg de Jordan Russell agregando lo siguiente:


{ MiniReg v1.0 by Jordan Russell
Note: For Delphi 3+, you'll need to change "OLE2" below to "ActiveX". }
uses
Windows, ActiveX,BDE; // BDE para usar la función dbiInit

var
BDECheck : Bool;

{x$R *.RES}

.......
.......

begin
if ParamCount <> 1 then
Exit;
BDECheck := (dbiInit(nil) = 0); //Aqui verifico si existe BDE,
//Esta idea la tomé de Trucomanía (http://www.q3.nu/trucomania/truco.cgi?475&esp)
If BDECheck = false then begin //Actúo en consecuencia
CoInitialize (nil);
try
RegisterServer (ParamStr(1));
finally
CoUninitialize;
end;
end;
end;


Saludos.

David
15-10-2006, 13:32:01
No me desinstala los alias :

si pongo esto , después de poner el else en el programa AddAlias como dice egostar :


[Run]
Filename: "{app}\Miprograma.exe"; Description: "{cm:LaunchProgram,Miprorgrama}"; Flags: nowait postinstall skipifsilent
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias1 ""{app}"" PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias2 ""{app}\tablas"" PARADOX"


Al poner - delante del alias , ni siquiere me instala los alias .

Si pongo esto , con el AddAlias original , y en la sección [Run] lo que he puesto arriba pero sin el signo - delante del alias , me instala los alias , pero no me lo desinstala .


[UninstallRun]
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias1 ""{app}"" PARADOX"
Filename: "{tmp}\AddAlias.exe"; Parameters: "-Alias2 ""{app}\tablas""


Y por otra parte , según dicen en la nueva versión de Inno setup , yo no puedes poner un icono de desinstalación , el comando UninstallIconFile , ya no funciona , queda muy mal , ir a inicio , programas y ver que el icono del programa y el desinstalación es el mismo .

Lepe
15-10-2006, 14:00:59
Y por otra parte , según dicen en la nueva versión de Inno setup , yo no puedes poner un icono de desinstalación , el comando UninstallIconFile , ya no funciona , queda muy mal , ir a inicio , programas y ver que el icono del programa y el desinstalación es el mismo .

Yo lo veo muy útil, se supone que estas en la ventana de "Desinstalar Programas", el hecho de ver un icono distinto desconcierta un poco, ya que tienes que leer el nombre para saber el programa que quieres desinstalar. Al ver el mismo icono de tu aplicación, lo localizas más rápido.

... Aunque sobre gustos no hay nada escrito ;).

Saludos

roman
15-10-2006, 16:15:10
se supone que estas en la ventana de "Desinstalar Programas"

No necesariamente. Creo que David se refiere al icono que se coloca en el menú inicio:

Inicio|Programas|Tu Aplicación

Ahí es donde resulta confuso.

En cuanto a por qué no funciona la desinstalación de alias hay que considerar dos puntos:

1. Tal como está no sirve porque AddAlias.exe se copia al directorio {tmp} y todo lo que está ahí se borra al final de la instalación. Debe entonces copiarse a algún otro drectorio, por ejemplo {app} o {app}\bin.

2. Revisando el código fuente de AddAlias veo que el signo - antes del nombre del alias no hace lo que estamos pensando.



1: Name of alias
if begins with '-' then delete first if exist
else do nothing if exist



Es decir, el alias de cualquier forma se agrega, sólo que si ya existe un alias con ese nombre, se borra antes.

Podría modificarse el programa para que sólo borre el alias, pero creo que yo lo que haría para matener las cosas separadas es crear un segundo programa DeleteAlias que sólo borre alias. Este DeleteAlias es el que se copiaría a {app}.

Le queda de tarea a David :)

// Saludos

David
15-10-2006, 16:54:50
A mi si esta y lo borra me viene perfecto , aunque luego lo instale .

Pero es que si pongo el signo - , como he dicho , es que no hace nada de nada .

Por que la única utilidad para desinstalar los alias es la siguiente . Cuando te instala el programa ,te instala los alias en el directorio donde esta la aplicación , si desinstalas , y no quitas los alias (el usuario no sabe hacerlo ) , luego instalas y si eliges otro directorio , los alias apuntan al directorio inicial , y el programa no funciona .

Por lo que si al instalar , encuentra los alias , los borrra y luego los escribe en la dirección correcta , estaria bien por mi parte .

Pero reitero , si pongo el signo - , como he explicado que he hecho , no hace nada de nada .

David
15-10-2006, 18:32:14
No necesariamente. Creo que David se refiere al icono que se coloca en el menú inicio:

Inicio|Programas|Tu Aplicación

Ahí es donde resulta confuso.


Ahí es donde digo , el icono del programa y el de desinstalación es el mismo . Y además primero te sale el de desintalación y luego el del programa . No es que sea un detalle muy importante , pero prefiero tener primero el icono del programa y luego otro dinstinto y debajo el de desinstalar.

Lepe
15-10-2006, 18:41:56
Bueno, quizás y solo quizás, no se deba poner el icono de desintalación tan a mano de usuarios inexpertos, y por esa razón, no debe ponerse en inico -> Programas (alguna vez le he dado sin querer :D)

Nero 6, Office, incluso BDS 2006 no traen los iconos de desinstalar en inicio -> programas.

El hecho de hacer un programa para añadir alias y otro para borrar, me parece demasiado, yo al menos cambiaría el nombre del programa "AddAlias" por "AliasManager" con una linea de comando:

AliasManager /add MiAlias
AliasManager /del Mialias
AliasManager /h
AliasManager /help
AliasManager /?

Las 3 últimas muestran un mensaje con los parámetros que se pueden usar y qué hace cada uno.

Saludos

roman
17-10-2006, 23:04:42
Regresando a lo del icono para desinstalar:

Si se quiere cambiar el icono que aparece en la ventana "Agregar o quitar programas" basta usar la opción UninstallDisplayIcon en la sección [Setup]. De hecho, también puede cambiarse el texto que aparece usando UninstallDisplayName:


[Setup]
...
UninstallDisplayIcon={app}\eliminar.ico
UninstallDisplayName="¡¡Quita ya esta cosa de mi sistema!!"
...


También puede usarse una librería de iconos o un exe o dll. En tal caso se puede especificar el índice del icono que se quiera usar. Por ejemplo:


[Setup]
...
UninstallDisplayIcon={sys}\shell32.dll,31
...


hará que aparezca el icono número 31 de la librería shell32.dll (que resulta ser el icono de la papelera).

Por otra parte, también puede cambiarse el icono que usemos en el menú de Inicio para acceso directo al desinstalador. De hecho, como con cualquier otro icono de acceso directo, puede usarse uno distinto del de la aplicación destino. Para ello hay que usar la directiva IconFileName y opcionalmente IconIndex. Por ejemplo:


[Icons]
Name: "{group}\Quitar programa"; Filename: "{uninstallexe}"; IconFilename: "eliminar.ico"


para usar un icono fijo, o bien


[Icons]
Name: "{group}\Quitar programa"; Filename: "{uninstallexe}"; IconFilename: "{sys}\shell32.dll"; IconIndex: 31


Coincido con Lepe en que en la ventana "Agregar o quitar programas" conviene usar el mismo icono que el de la aplicación para poder distinguirlo rápidamente. Pero en el menú Inicio, usar un icono distinto evitará que accidentalmente desisntalemos la aplicación.

// Saludos

egostar
17-10-2006, 23:56:30
El hecho de hacer un programa para añadir alias y otro para borrar, me parece demasiado, yo al menos cambiaría el nombre del programa "AddAlias" por "AliasManager" con una linea de comando:

"Robandome" la buena idea de Lepe les dejo aqui las modificaciones que hice.


{
program adds a alias to the BDE configuration file
parameters:
0: programname + path (standard parameter of OS)
1: Name of alias
if begins with '-' then delete first if exist
else do nothing if exist
2: path to data directory
3: BDE driver name
Bugfix: Savierhs Lopez Arteaga 3.1.2001
AddAlias didn't delete alias with beginning '-'

Modificación para una operación genérica
1: Tipo de Operación ( /ADD, /DEL)
2: Nombre de Alias
3: Ruta de Directorio de Datos
4: Driver de BDE
}

program AliasManager;
uses
Windows, SysUtils, BDE;

var
GType: string; //Tipo de Operación
GAlias: string;
GDriver: string;
GAliasDir: string;
FParams: string;
FDrvName: string;
FDelete: boolean;
i: integer;

function StrToOem(const AnsiStr: string): string;
begin
SetLength(Result, Length(AnsiStr));
if Length(Result) > 0 then
CharToOem(PChar(AnsiStr), PChar(Result));
end;

{-----------------------------------------------------------------------}
begin
for i := 1 to ParamCount do
begin
case i of
1: GType := ParamStr(1);
2: GAlias := ParamStr(2);
3: GAliasDir := ParamStr(3);
4: GDriver := ParamStr(4);
end;
end;

// Tipo de Operación
if GType = '/DEL' then
FDelete := True
else FDelete := False;

//default alias
if GAliasDir = '' then GAliasDir := ExtractFilePath(ParamStr(0))+'Tables';
FDrvName := GDriver;

//set Parameters, the driver and server name
if (CompareText(GDriver, szCFGDBSTANDARD) = 0) or
(CompareText(GDriver, szPARADOX) = 0) or
(CompareText(GDriver, szDBASE) = 0) or
(CompareText(GDriver, szFOXPRO) = 0) or
(CompareText(GDriver, szASCII) = 0) then
begin
if (CompareText(GDriver, szCFGDBSTANDARD) = 0) then FDrvName := szPARADOX;

//set parameters for the new alias
FParams := Format('%s:"%s"', [szCFGDBPATH, GAliasDir]) +
Format(';%s:"%s"', [szCFGDBDEFAULTDRIVER, GDriver]) +
Format(';%s:"%s"', [szCFGDBENABLEBCD, szCFGFALSE]);
end else begin
if (CompareText(GDriver, 'INTRBASE') = 0)
then FParams := Format('%s:"%s"', [szSERVERNAME, GAliasDir])
else FParams := Format('%s:"%s"', [szDATABASENAME, GAliasDir]);
//add other Parameters here !!!!!!!!!!!!!!!!!
end;

DbiInit(nil);
try
if FDelete then
try
DbiDeleteAlias(nil, PChar(GAlias));
except
end
else //Conserve este else
try
DbiDeleteAlias(nil, PChar(GAlias)); //Se debe borrar el Alias si existe
// ya que no hay una función que
// permita cambiar el Path
DbiAddAlias(nil, PChar(StrToOem(GAlias)),
PChar(StrToOem(FDrvName)),
PChar(FParams), True);
DbiCfgSave(nil, nil, True);
except
end;
finally
DbiExit();
end;
end.
//----------------------------------------------------------------------


Por otro lado el programa de instalación se ve así


[Files]
Source: "D:\Installers\AliasManager\AliasManager.exe"; DestDir: "{app}"

[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"

[Run]
Filename: "{app}\AliasManager.exe"; Parameters: "/ADD MANAGER ""{app}""\tables PARADOX"

[UninstallRun]
Filename: "{app}\AliasManager.exe"; Parameters: "/DEL MANAGER"



Ya he probado instalando, reinstalando cambiando el path del sistema y desinstalando.

Hizo todo lo que se esperaba.

Saludos.

roman
18-10-2006, 18:10:31
Yo añadiría el StrToOem al FParams. Haciendo una prueba, si se ejecuta el programa desde la línea de comandos y se le pasa una ruta que tenga acentos, no la lee correctamente.

// Saludos

David
19-10-2006, 18:26:01
[Files]
Source: "D:\Installers\AliasManager\AliasManager.exe"; DestDir: "{app}"

[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"

[Run]
Filename: "{app}\AliasManager.exe"; Parameters: "/ADD MANAGER ""{app}""\tables PARADOX"

[UninstallRun]
Filename: "{app}\AliasManager.exe"; Parameters: "/DEL MANAGER"


Aquí hay algo que no entiendo y es donde pones el alias .

Imaginemos que tengo un alias , llamado Alias1 , dónde lo pondría ?

Con respecto a lo que dice román , de poner StrToOem(FParams) , a cual hay que ponerle esta función , quizás sólo a este :

DbiAddAlias(nil, PChar(StrToOem(GAlias)),
PChar(StrToOem(FDrvName)),
PChar(StrToOem(FParams)), True);

Un saludo

egostar
19-10-2006, 18:31:56
Aquí hay algo que no entiendo y es donde pones el alias .

Imaginemos que tengo un alias , llamado Alias1 , dónde lo pondría ?

Con respecto a lo que dice román , de poner StrToOem(FParams) , a cual hay que ponerle esta función , quizás sólo a este :

DbiAddAlias(nil, PChar(StrToOem(GAlias)),
PChar(StrToOem(FDrvName)),
PChar(StrToOem(FParams)), True);

Un saludo

Aqui te muestro donde.


[Run]
Filename: "{app}\AliasManager.exe"; Parameters: "/ADD ALIAS1 ""{app}""\tables PARADOX"

[UninstallRun]
Filename: "{app}\AliasManager.exe"; Parameters: "/DEL ALIAS1"



Saludos

David
24-10-2006, 16:15:18
La instalación ya me funciona perfectamente .

Pero puestos a mejorar en este post , me pregunto si seria posible una instalación en red con los alias y todo .

Recuerdo que para instalar paradox en red , hay que instalar en BDE en los dos ordenadores . Hay que crear 2 unidades mapeadas , por ejemplo J e I . Hay que crear una carpeta dentro del directorio de la aplicación llamada por ejemplo net.

Los alias , ya no apuntan a app/tablas , sino a J:/tablas (J:\ unidad mapeada donde esta el programa ) y además en el BDE , en la página de Configuración , en Drivers -> Native -> Paradox , hay que poner la unidad mapeada I , en Net Dir , que corresponde a la carpeta {app\net} .

Hacer esto para instalar paradox en red no es dificil , lo haces una vez o dos y ya lo sabes para otras , pero pregunto , habría alguna posibilidad de hacer esto con el instalador Inno Setup .

O esto ya es demasiado :D

Lepe
25-10-2006, 00:52:07
Simplemente no uses unidades mapeadas.

Puedes usar rutas del tipo : "\\nombreservidor\nombrecarpeta".

Al ser compartida con acceso global, tambien comparte todas las subcarpetas. Esa carpeta tendrá una subcarpeta que se llama "net" y dentro es donde redireccionas el NETFILEDIR de tu session en paradox.

Al realizar la instalación con innosetup, lo mejor es hacerlo en una memoria USB, de esa forma tu cliente puede elegir qué ordenador de la red actuará como servidor, en un archivo se guarda la configuración de la instalación "Servidor", y despues al instalar en modo cliente se lee de ese archivo. Todo queda configurado correctamente.

Los alias pueden ser creados dinámicamente con Database.Session.AddStandardAlias así que tampoco es problema.

El problema de TODO es elegir un camino de los 300 que llevan al mismo fin.

Saludos.