View Full Version : Delphi Far eseguire programmi
ok ho bisogno di 1 mano con delphi, devo scrivere 1 programma che quando lanciato esegua altri 2 .exe, questi 2 eseguibili sono nella stessa cartella del exe ke voglio scrivere ma la loro collocazione nn e' sempre uguale (lo voglio mettere su una chiavetta usb quindi il nome dell'unita' cambia a seconda del computer in cui la inserisci),
qualcuno puo' aiutarmi, probabilmente sono 2 righe di programma pero' mi servirebbe veramante 1 mano:help: :help:
bump, so che non e' bello ma mi serve proprio 1 risposta:(
cdimauro
05-08-2007, 21:40
ShellExecute(0, nil, 'notepad.exe', nil, PChar('.'), SW_SHOWNORMAL);
questo esegue notepad giusto? ma e' svincolato dalla lettera dell'unita'?
cdimauro
05-08-2007, 23:39
Sì, esegue il notepad (giusto per provare).
E' svincolato dalla lettera dell'unità perché ho impostato '.' come directory da usare per lanciare il comando (PChar('.') serve appunto a specificarlo).
ma se devo eseguire il programma X:\pippo\programma.exe (x sta per la lettera svincolata) ma la cartella pippo e' fissa ci metto cosa? e x cosa sta nil e 0?
scusate per la nubbiaggine, so di essere noioso...:( :( :( :muro:
cdimauro
06-08-2007, 14:16
ma se devo eseguire il programma X:\pippo\programma.exe (x sta per la lettera svincolata) ma la cartella pippo e' fissa ci metto cosa?
Tu avevi scritto questo:
"scrivere 1 programma che quando lanciato esegua altri 2 .exe, questi 2 eseguibili sono nella stessa cartella del exe ke voglio scrivere"
per cui quando parte l'applicazione principale, questa si troverà in una certa cartella (anche dentro una chiavetta USB, è lo stesso).
Quando quest'applicazione lancerà a loro volta le altre due, queste due, visto che è specificato "." come cartella "di partenza", "erediteranno" la stessa cartella in cui si trova quella principale.
Dunque non hai alcun bisogno di specificare dei path, tanto meno assoluti.
e x cosa sta nil
NIL = "Not InLine", ed è esattamente equivalente al NULL di C & derivati. Indica che non è stato passato alcun dato.
http://msdn2.microsoft.com/en-us/library/ms647732.aspx
Il primo nil indica che non hai specificato l'azione da eseguire, quindi varrà questo:
"NULL
In systems prior to Microsoft Windows 2000, the default verb is used if it is valid and available in the registry. If not, the "open" verb is used.
In Windows 2000 and later, the default verb is used if available. If not, the "open" verb is used. If neither verb is available, the system uses the first verb listed in the registry."
Il secondo nil riguarda invece i parametri addizionali, da passare, per cui il sistema si comporterà in questo modo:
"If lpFile specifies an executable file, this parameter is a pointer to a null-terminated string that specifies the parameters to be passed to the application."
Quindi saranno i parametri da passare all'applicazione.
e 0?
Al posto dello zero dovrebbe esserci l'handle della finestra a cui dovrebbe essere agganciata l'applicazione:
"A handle to the owner window used for displaying a user interface (UI) or error messages. This value can be NULL if the operation is not associated with a window."
In questo caso (0 o NULL in QUESTO contesto si possono usare indifferentemente) vale la seconda, cioé l'applicazione lanciata non sarà legata a nessuna finestra (e relativa applicazione). Dunque sarà svincolata / indipendente.
scusate per la nubbiaggine, so di essere noioso...:( :( :( :muro:
Non ti preoccupare: qui nessuno è nato imparato. ;)
ok, come evento d 1 pulsante va bene?
ma se devo eseguire il programma X:\pippo\programma.exe (x sta per la lettera svincolata) ma la cartella pippo e' fissa ci metto cosa?
intendevo che il programma che devo scrivere si trovera so x:\ mentre i 2 exe da eseguire sono in X:\pippo\ :doh: prima mi sono spiegato male, cmq grazie x l'aiuto!!!!
mi da che non conosce il comando, devo mettere qualke include?
cdimauro
06-08-2007, 20:49
ok, come evento d 1 pulsante va bene?
Va benissimo.
Comunque se hai bisogno di lanciarli immediatamente alla partenza dell'applicazione principale hai due possibilità (ce ne sarebbero altre, ma per semplificatre rimaniamo con due :D):
- inserisci le due ShellExecute dentro l'evento FormCreate del form principale;
- inserisci le due ShellExecute dentro il corpo programma principale.
In quest'ultimo caso avresti qualcosa del tipo:
program ProvaShellExecute;
uses
ShellApi;
begin
ShellExecute(...);
ShellExecute(...);
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
intendevo che il programma che devo scrivere si trovera so x:\ mentre i 2 exe da eseguire sono in X:\pippo\ :doh: prima mi sono spiegato male, cmq grazie x l'aiuto!!!!
Di niente, dai. :)
Comunque in tal caso ti conviene specificare 'pippo\notepad.exe' anziché 'notepad.exe', oppure se i programmi hanno bisogno di "trovarsi già dentro la cartella pippo' allora al posto di PChar('.') metti PChar('pippo').
mi da che non conosce il comando, devo mettere qualke include?
Devi mettere:
implementation
uses
ShellAPI;
procedure Button1Click(Sender: TObject);
begin
ShellExecute(...);
end;
Che fa uso dell'evento Click legato a un pulsante. ;)
quando eseguo il comando il debugger mi da EAcces Violation on kernel32.dll, eppure si compila, puo' essere 1 prob d window?
cdimauro
07-08-2007, 14:18
Mi sembra strano. Posta il pezzo di codice in oggetto, e dimmi anche su quale s.o. stai lavorando.
questo e' tutto il programma, e' solo la versione di test:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0, nil, 'freepopsd.exe', nil, PChar('FreePOPs'), SW_SHOWNORMAL);
ShellExecute(0, nil, 'ThunderbirdPortable.exe', nil, PChar('.'), SW_SHOWNORMAL);
close();
end;
end.
uso winxp
ad entrambe le chiamate al quarto parametro anzichè nil prova a metterci PChar(''), cioè stringa vuota.
non cambia niente, mi da lettura di indirizzo 000002E (penso sia esadecimale) fallito, ho provato anke a cambiare pc ma niente...
sono anni che non tocco Delphi ma mi sa tanto che anche il terzo parametro (in entrambe le chiamate) andrebbe castato a PChar...
ora provo, ma il debug riconosce l'oxazione, solo ke da 1 accesso nn autorizzato a kernel32.dll il che e' alquanto strano...:stordita:
Edit: Infatti nn funzia, mi da errore al codice: 7C809DEA
ora provo, ma il debug riconosce l'oxazione, solo ke da 1 accesso nn autorizzato a kernel32.dll il che e' alquanto strano...:stordita: non è un "accesso non autorizzato", è semplicemente l'equivalente di un segmentation fault di Linux; la funzione API che hai richiamato (o una di quelle che vengono a loro volta richiamate da essa, forse la CreateFile) sta tentando di accedere ad un indirizzo di memoria non valido probabilmente perché la stringa non gliela puoi passare così com'è ma va castata. questo credo sia dovuto alla particolare gestione delle stringhe in Delphi.
non è un "accesso non autorizzato", è semplicemente l'equivalente di un segmentation fault di Linux; la funzione API che hai richiamato (o una di quelle che vengono a loro volta richiamate da essa, forse la CreateFile) sta tentando di accedere ad un indirizzo di memoria non valido probabilmente perché la stringa non gliela puoi passare così com'è ma va castata. questo credo sia dovuto alla particolare gestione delle stringhe in Delphi.
favoloso, xro' e' come se mi avessi parlato in armaico antico:(
cosa devo fare quindi in pratica, plz, sto impazzendo!!!!!:muro:
favoloso, xro' e' come se mi avessi parlato in armaico antico:(
cosa devo fare quindi in pratica, plz, sto impazzendo!!!!!:muro: mi pareva di averlo fatto capire perfettamente ormai :mbe:
ShellExecute(0, nil, PChar('freepopsd.exe'), nil, PChar('FreePOPs'), SW_SHOWNORMAL);
ShellExecute(0, nil, PChar('ThunderbirdPortable.exe'), nil, PChar('.'), SW_SHOWNORMAL);
è solo una prova eh, non tocco Delphi da anni.
intendevo "la funzione API" e il fatto che deve essere "castato"... a me suona arabo...:( sono nubbissimo
cmq ho provato ma l'errore nn se ne va
intendevo "la funzione API" e il fatto che deve essere "castato"... a me suona arabo...:( sono nubbissimo la "funzione API" sarebbe la ShellExecute, e il "cast" di un valore sarebbe la conversione esplicita di quel valore dal suo tipo ad un altro tipo. sarebbe quando in Delphi usi il nome di un tipo a mo' di funzione, come ti ha fatto fare cdimauro con PChar: le stringhe da passare alla ShellExecute vanno convertite dal tipo string di Delphi al tipo PChar (puntatore a caratteri).
cmq ho provato ma l'errore nn se ne va e allora mi sa tanto che sta da qualche altra parte... :D
dal momento che non hai visto la finestra di "segnalazione errori" di XP, ma hai visto una Access Violation con tanto di indirizzi esadecimali, suppongo che quella sia una finestra mostrata dalla VCL che ha acchiappato l'eccezione e se la gestisce mostrando appunto la finestrella. dai vaghissimi ricordi che ho di Delphi se clicchi uno dei bottoni della finestrella il debugger dovrebbe fermarti sull'istruzione esatta che ha fatto saltare l'eccezione.
:cry: :cry: :cry: :cry: :cry: :cry: :cry:
Ce L'HO FATTA
l'errore stava qui: ShellExecute(0, nil, PChar('ThunderbirdPortable.exe'), nil, PChar('.'), SW_SHOWNORMAL);
non accettava PChar('.') ho cambiato la cartella e ora funzia, me ne sono accorto xke freepops partiva ma thunderbird no... grazie a tutti veramente!!!!!!!
Edit: adesso mi serve solo saxre dove trovo l'evento on open della form 1 ho guardato sui possibili eventi del form ma niente di somigliante!!!!
Edit 2: ho risolto, on Activate
Edit 2: ho risolto, on Activate ma così ti scatta tutte le volte che torni alla tua form con Alt+Tab. mi pare di ricordare che ci fosse un certo OnShow, non andrebbe meglio?
cdimauro
07-08-2007, 20:20
questo e' tutto il programma, e' solo la versione di test:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0, nil, 'freepopsd.exe', nil, PChar('FreePOPs'), SW_SHOWNORMAL);
ShellExecute(0, nil, 'ThunderbirdPortable.exe', nil, PChar('.\'), SW_SHOWNORMAL);
close();
end;
end.
uso winxp
A quanto pare al kernel PChar('.') non piace, ma pretende PChar('.\') per indicare la cartella corrente. :p
cdimauro
07-08-2007, 20:23
sono anni che non tocco Delphi ma mi sa tanto che anche il terzo parametro (in entrambe le chiamate) andrebbe castato a PChar...
Potrebbe anche provare a togliere il PChar e lasciare soltanto '.\', perché se non ricordo male le (ansi)string di Delphi sono realizzate come puntatore al primo carattere della stringa, e sono sempre terminate dal carattere NUL (ASCII 0) in modo da poter essere passate così come sono (ma soltanto read-only ovviamente) alle funzioni che si aspettano un puntatore a carattere (quindi sia le funzioni del s.o. che quelle di librerie et similia). ;)
Delphi rulez. :D
cdimauro
07-08-2007, 20:25
Edit: adesso mi serve solo saxre dove trovo l'evento on open della form 1 ho guardato sui possibili eventi del form ma niente di somigliante!!!!
Edit 2: ho risolto, on Activate
No, ha ragione Alberto: l'evento verrebbe richiamato ogni volta che la finestra viene attivata.
Se vuoi invece lanciare le due applicazioni soltanto una volta, l'evento giusto da usare è OnCreate.
nn c'e' problema xke se guardate bene il mio script alla fine ho inserito 1 close(); che quindi chiude la finestra corrente rendendo quindi, ovviamente, impossibile il passaggio con alt+tab :-P , penso di aver saltato 2 metri quando ho visto ke il programma funziava, grazie un 1000000000 a tutti!!!!! :D
cdimauro
07-08-2007, 21:26
Di niente. :)
Comunque se il tuo scopo è soltanto quello di far partire due applicazioni, puoi anche fare a meno di creare un form e farlo chiudere immediatamente dopo averle lanciate. La soluzione è quel pezzo di sorgente che inizia con program ProvaShellExecute; che t'avevo postato prima. ;)
si ma quando apro delphi la form1 e' gia' definita, come faccio a toglierla del tutto?:confused:
cdimauro
07-08-2007, 21:44
Project/Options... -> Forms
togli il form dall'elenco "Auto-create forms:"
Di niente. :)
Comunque se il tuo scopo è soltanto quello di far partire due applicazioni, puoi anche fare a meno di creare un form e farlo chiudere immediatamente dopo averle lanciate. La soluzione è quel pezzo di sorgente che inizia con program ProvaShellExecute; che t'avevo postato prima. ;)
mettendolo nel corpo del prog x qalche motivo nn mi accetta SW_SHOWNORMAL :mbe:
mettendolo nel corpo del prog x qalche motivo nn mi accetta SW_SHOWNORMAL :mbe: dev'essere un problema di units incluse dalla clausola uses. controlla di aver incluso Windows e ShellAPI.
cdimauro
08-08-2007, 08:20
Infatti SW_SHOWNORMAL sta in Windows. :cool:
adesso delphi mi spara fuori 1 messaggio dicendomi che nn trova rtl60.bpl, dove dovrebbe essere?:mc: mi stanno cadendo i (_)(_)
cdimauro
08-08-2007, 19:16
Questo capita generalmente quando hai preso un progetto realizzato con una vecchia versione di Delphi e adesso ci stai lavorando con una più nuova.
Se posso permettermi, ti suggerisco di scaricare e usare Turbo Delphi 2006 da qui http://www.codegear.com/downloads/free/turbo e installarlo, previa registrazione ovviamente. E' un ambiente completo ed è totalmente gratuito (la versione Professional, invece, è a pagamento); per inciso, è quello che ho usato per le prove in questi giorni. ;)
cosa sarebbe? 1 alternativa al borland o 1 plug ine quale devo scaricare della lista nel link? cmq il prob d prima l'ho risolto... era xke mancavano dei file nella cartella sistem32 d window
cdimauro
08-08-2007, 19:48
Code Gear è nata lo scorso anno dalla Borland, che ha preferito creare una società ad hoc esclusivamente per lo sviluppo degli IDE.
Quindi tutti gli IDE che prima erano "by Borland" adesso sono "by Code Gear", anche se quest'ultima è una controllata della prima. ;)
In soldoni: si tratta sempre di Delphi & co. :p
adesso mi butto da 1 ponte, adesso mi da errore sulla riga del program:muro: :muro: :muro: :muro: "[Fatal Error] Project1.dpr(1): File not found: 'System.pas'"
cosa ci posso fare?
cdimauro
08-08-2007, 21:12
:eek: System è la unit di sistema!
A questo punto è evidente che hai serii problemi con l'IDE che hai installato, per cui consiglio caldamente di scaricarti e installare Turbo Delphi 2006 dal link che t'ho passato. :cool:
ok ho bisogno di 1 mano con delphi, devo scrivere 1 programma che quando lanciato esegua altri 2 .exe, questi 2 eseguibili sono nella stessa cartella del exe ke voglio scrivere ma la loro collocazione nn e' sempre uguale (lo voglio mettere su una chiavetta usb quindi il nome dell'unita' cambia a seconda del computer in cui la inserisci),
qualcuno puo' aiutarmi, probabilmente sono 2 righe di programma pero' mi servirebbe veramante 1 mano:help: :help:
intendevo che il programma che devo scrivere si trovera so x:\ mentre i 2 exe da eseguire sono in X:\pippo\ :doh: prima mi sono spiegato male, cmq grazie x l'aiuto!!!!
Bastano due righe...
program Esegui;
uses SysUtils, windows, ShellApi, Forms;
var
Path : String;
begin
Path := ExtractFilePath(Application.ExeName) + 'pippo\';
ShellExecute(0,'open', PChar(Path + 'freepopsd.exe'), nil, nil, SW_SHOWNORMAL);
ShellExecute(0,'open', PChar(Path + 'ThunderbirdPortable.exe'), nil, nil, SW_SHOWNORMAL);
end.
Ciao.
Ops... corretto
P.S. Metto pure l'allegato :p .
e la variabile Path a che serviva? :wtf:
credo che la volesse usare al posto del secondo nil per impostare il path...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.