Newsgroup: it.comp.lang.delphi
Titolo: Intercettare errore caricamento package

Salve
Ci giro intorno da un po'
- Compilo un'applicazione con un dato package inpostato su option -> runtime 
package.
- Se all'avvio dell'aplicazione il package non e' disponibile saltera' fuori 
una excepion.
E' possibile gestire questa eccezione per eseguire della azione nel caso il 
file bpl non fsse disponibile ?
Saluti 

 file bpl non fsse disponibile ?
Dipende dal momento in cui il sistema operativo tenterà di caricare il 
package a runtime.
Dovresti riuscire a fare preventivamente un controllo da codice, in 
partenza dell'applicazione, che verifichi l'esistenza di risorse 
necessarie all'esecuzione (dll, packages,risorse, ecc) ed imposti dei 
flag globali da interrogare durante il runtime.
ciao
-- 
morde
D5,D6,D7
QT 4.7.0 - MingW- QT Creator 2.1

Usando il debug integrato l'errore di mancanza del package viene emesso 
prima di eseguire la prima istruzione. ho visto l'evento 
Application.OnException ma in questo caso non so quando riassegnarlo.
Quello che di fatto vorrei fare e nel caso di mancanza di un dato package 
copiarlo in automatico da una share di rete.
Saluti 

 copiarlo in automatico da una share di rete.
Allora puoi crearti un programma che fa da "launcher"  del programma 
vero e proprio. Un piccolo processo che copia i file necessari e poi fa 
una createprocess() del programma principale.
Dovresti uscirne pulito in questo modo.
Questa onnipresente function usata anni e anni mi ha sempre permesso di 
lanciare processi con il massimo grado di controllo:
(va reindentata ma è molto semplice)
function WinExecAndWait32V2( const FileName, CurrDir: string;
Visibility: integer ): DWORD;
{ V1 by Pat Ritchey, V2 by P.Below }
procedure WaitFor( processHandle: THandle );
var
msg: TMsg;
ret: DWORD;
begin
repeat
ret := MsgWaitForMultipleObjects(
1, { 1 handle to wait for }
processHandle, { the handle }
FALSE, { wake on any event }
INFINITE, { wait without timeout }
QS_PAINT or { wake on paint messages }
QS_SENDMESSAGE { or messages from other threads }
);
if ret = WAIT_FAILED then Exit; { can do little here }
if ret = (WAIT_OBJECT_0+1) then begin
{ Woke on message, process paint messages only. Calling
PeekMessage gets messages sent from other threads processed. }
while PeekMessage( msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE ) do
DispatchMessage( msg );
end;
until ret = WAIT_OBJECT_0;
end;{ WaitFor }
var
zAppName: array[ 0..512 ] of char;
zAppPath: array[ 0..512 ] of char;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
{ProHandle: THandle;}
Buf1, Buf2: array[ 0..80 ] of char;
begin{ WinExecAndWait32V2 }
StrPCopy( zAppName, FileName );
StrPCopy( zAppPath, CurrDir );
FillChar( StartupInfo, SizeOf(StartupInfo), $00 );
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess( NIL,
zAppName, { pointer to command line string }
NIL, { pointer to process security
attributes }
NIL, { pointer to thread security
attributes }
FALSE, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
NIL, { pointer to environment block }
zAppPath, { pointer to current directory name}
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo ) { pointer to PROCESS_INF }
then
Result := DWORD( -1 ) { failed, GetLastError has error code }
else begin
WaitFor( ProcessInfo.hProcess );
GetExitCodeProcess( ProcessInfo.hProcess, Result );
CloseHandle( ProcessInfo.hProcess );
CloseHandle( ProcessInfo.hThread );
end;
end;{ WinExecAndWait32V2 }



Una alternativa alla strada suggerita da morde e' quella di caricare i
package dinamicamente come una qualsiasi DLL usando la
funzione LoadPackage('mypackage.bpl')
Qui c'e' un articoletto sull'argomento:
http://edn.embarcadero.com/article/27178
ciao
Giacomo