Newsgroup: it.comp.lang.delphi
Titolo: Buffo problema con ShellExecute

Salve amici.
Buffo problema...
Nel mio programma devo lanciare un programma (o meglio....vorrei lanciare 
"script.txt"    tanto il txt è già associato al notepad...).
uses .....,ShellAPI,ExtActns
....
...
...
procedure TfrmMain.btEditScriptClick(Sender: TObject);
var
script:string;
begin
script:='script.txt';
ShellExecute(0,nil, PChar(script), nil, nil, SW_NORMAL);
end;
Al momento della compilazione mi dà errore sulla ShellExecute:
"Statement expected, but expression of type 'Cardinal' found"
dove sbaglio?!?!
Grazie dell'aiuto!

 dove sbaglio?!?!
Prova a passare esplicitamente la directory o una stringa vuota, riporto 
da win32.hlp:
"lpDirectory
Pointer to a null-terminated string that specifies the default 
directory."
Penso che il problema sia qua, non ho provato.
Ciao
---
Ryo GQI 

 Ryo GQI
Stesso problema! :(
shellexecute(Handle,'open','C:\windows\notepad.exe',nil,nil,SW_show);

ShellExecute(0,nil, PChar(script), nil, nil, SW_NORMAL);
Guarda la documentazione di ShellExecute().
Manca un parametro.
Impara a usare Google:
http://groups.google.it/groups?hl=it&q=shellexecute&btnG=Cerca+con+Google&sa=N&tab=wg

Forse non mi sono spiegato bene, intendevo dire che la chiamata doveva 
essere:
ShellExecute(0,nil, PChar(script), nil, PChar(TuaDirectory), SW_NORMAL);
Ciao.
---
Ryo GQI 

idem...
ShellExecute(0,nil, PChar(script), nil, PChar('c:\'), SW_NORMAL); 

 ha scritto nel messaggio 
news:lfm0225k533bbeqbi...@4ax.com...

Mah... guarda.. ho la shellexecute l'ho presa con un copia incolla da altri 
progetti che ho già fatto e funzionano tutti a meraviglia.
Quale parametro mancherebbe? E perchè gli altri progetti mi funzionano? 

Dimenticavo... se ti riferisci all' "open", non deve dare errore il 
compilatore se ci metto 'nil'.

ShellExecute(0,nil, PChar(script), nil, PChar(TuaDirectory), SW_NORMAL);
GUARDATE LA DOCUMENTAZIONE DI SHELLEXECUTE!

 PChar('-s:c:\ftpscript.txt'), PChar(''), SW_SHOWNORMAL);
Un metodo che sicuramente funziona è quello di passare dalla shell:
ShellExecute(0, nil, 'cmd.exe', '/c fpt.exe -s:c:\ftpscript.txt', '',
SW_SHOWNORMAL);
Ca##o! Sono 6 i parametri no???????????????

Duh! 6 parametri giusto?
Syntax
HINSTANCE ShellExecute(          HWND hwnd,
    LPCTSTR lpOperation,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);Parameters
    hwnd
    [in] 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.
    lpOperation
    [in] Pointer to a null-terminated string, referred to in this case as a 
verb, that specifies the action to be performed. The set of available verbs 
depends on the particular file or folder. Generally, the actions available 
from an object's shortcut menu are available verbs. For more information 
about verbs and their availability, see Object Verbs. See Extending Shortcut 
Menus for further discussion of shortcut menus. The following verbs are 
commonly used.
      edit
      Launches an editor and opens the document for editing. If lpFile is 
not a document file, the function will fail.
      explore
      Explores the folder specified by lpFile.
      find
      Initiates a search starting from the specified directory.
      open
      Opens the file specified by the lpFile parameter. The file can be an 
executable file, a document file, or a folder.
      print
      Prints the document file specified by lpFile. If lpFile is not a 
document file, the function will fail.
      NULL
      For 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.
      For Windows 2000 and later systems, 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.
    lpFile
    [in] Pointer to a null-terminated string that specifies the file or 
object on which to execute the specified verb. To specify a Shell namespace 
object, pass the fully qualified parse name. Note that not all verbs are 
supported on all objects. For example, not all document types support the 
"print" verb.
    lpParameters
    [in] If the lpFile parameter specifies an executable file, lpParameters 
is a pointer to a null-terminated string that specifies the parameters to be 
passed to the application. The format of this string is determined by the 
verb that is to be invoked. If lpFile specifies a document file, 
lpParameters should be NULL.
    lpDirectory
    [in] Pointer to a null-terminated string that specifies the default 
directory.
    nShowCmd
    [in] Flags that specify how an application is to be displayed when it is 
opened. If lpFile specifies a document file, the flag is simply passed to 
the associated application. It is up to the application to decide how to 
handle it.
      SW_HIDE
      Hides the window and activates another window.
      SW_MAXIMIZE
      Maximizes the specified window.
      SW_MINIMIZE
      Minimizes the specified window and activates the next top-level window 
in the z-order.
      SW_RESTORE
      Activates and displays the window. If the window is minimized or 
maximized, Windows restores it to its original size and position. An 
application should specify this flag when restoring a minimized window.
      SW_SHOW
      Activates the window and displays it in its current size and position.
      SW_SHOWDEFAULT
      Sets the show state based on the SW_ flag specified in the STARTUPINFO 
structure passed to the CreateProcess function by the program that started 
the application. An application should call ShowWindow with this flag to set 
the initial show state of its main window.
      SW_SHOWMAXIMIZED
      Activates the window and displays it as a maximized window.
      SW_SHOWMINIMIZED
      Activates the window and displays it as a minimized window.
      SW_SHOWMINNOACTIVE
      Displays the window as a minimized window. The active window remains 
active.
      SW_SHOWNA
      Displays the window in its current state. The active window remains 
active.
      SW_SHOWNOACTIVATE
      Displays a window in its most recent size and position. The active 
window remains active.
      SW_SHOWNORMAL
      Activates and displays a window. If the window is minimized or 
maximized, Windows restores it to its original size and position. An 
application should specify this flag when displaying the window for the 
first time.
Return Value

> ShellExecute(
0,
nil,
 PChar(script),
nil,
 nil,
 SW_NORMAL);
Ecco, scrivilo così, proprio allo stesso modo, con un solo parametro per 
riga. Il compilatore ti darà il numero esatto della riga dove c'è il 
parametro errato. Credo l'ide ti ci sposterà su il cursore.
Poi capirai al volo cosa sbagli.
A prima occhiata mi pare ci sia qualche parametro in meno. Ma ora sono 
troppo stanco per andare a controllare. 

 ha scritto nel messaggio 
news:44206a86$0$36933$4faf...@reader3.news.tin.it...

ShellExecute(0,
'open',
PChar(script),
nil,
nil,
SW_NORMAL);   <---- errore qui   (ripeto che il codice è un copia-incolla da 
un'altro mio progetto (che ovviamente funziona!)
A questo punto credo che sia qualche impostazione del compilatore/linker, 
non sò come altro spiegarmelo.
Cmq grazie, ALMENO TU sei stato gentile e non hai "sparato a vuoto" (ottima 
idea quella di mettere il codice in quel modo! non conoscevo questa 
chicca!).

 Al momento della compilazione mi dà errore sulla ShellExecute:
Io avevo fatto così:
var
    execfpc : pchar;
begin
[cut]
ShellExecute(0,'open',execfpc,'','',SW_SHOWNORMAL);
[cut]
end;
e funzionava correttamente...
Valter

Cmq grazie, ALMENO TU sei stato gentile e non hai "sparato a vuoto"
Ecco un altro che prima o poi finisce plonkato.  Più prima che poi.

first time.
Nella tua ShellExecute() manca SW_SHOWNORMAL (non esiste nessun flag
SW_NORMAL) e quand'è che va usato SW_SHOWNORMAL ? "when displaying the
window for the first time.".

 window for the first time.".
Peccato che dà errore ugualmente (e se fossi umile e cercassi su google, 
vedrai che esiste anche quel flag)

 ha scritto nel messaggio 
news:eer022d0kkbf3qif2...@4ax.com...

Sbrigati che io plonko adesso

vedrai che esiste anche quel flag)
Io non devo cercare un bel niente.  
Fammi vedere dov'è che leggi SW_NORMAL qui dentro:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp
Ti plonko comunque volentieri.

 dove sbaglio?!?!
Ho copiato e incollato la tua riga di codice e non ho ottenuto alcun 
errore di compilazione, quindi suppongo che il problema sia da ricercare 
altrove (ammesso che il codice che hai fornito non sia parziale o 
comunque diverso da quello effettivo in cui magari hai omesso proprio la 
causa verace del problema pensando che non fosse significativa).
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

  (
http://www.marco.breveglieri.name
)
Ciao Marco,
grazie per aver provato il mio codice.
Il codice "postato" è proprio il copia incolla dal mio progetto (che torno a 
ripetere... ho fatto il copia incolla da un'altro mio progetto che funziona 
benissimo).
L'unica speranza (forse) sarà quella di usare la form dell'altro progetto e 
riadattare i componenti, sperando di risolvere il problema.
Che sia qualche impostazione del compilatore? Misteri :)
Grazie per aver provato il codice ed avermi confermato che non sono io che 
sono uscito di testa :)
Ciauz!
Se ti fà piacere ti terrò informato sulla possibile soluzione :)

 e riadattare i componenti, sperando di risolvere il problema.
Non capisco ora dove sta il problema. Ti ho suggerito un codice sicuro per 
intercettare *il tuo problema*. Mi hai ringraziato per la chicca. Ma mica lo 
hai messo in pratica! Si può sapere dove ti segnala l'errore? In quale 
parametro? Sai leggere a quale riga te lo segnala? Il caret dove si ferma? 
Mi pare che qui nessuno sia un mago/programmatore, e non può basarsi sul 
nulla per aiutarti. Dire da una parte mi funziona dall'altra no, cosa 
significa? Nulla. Che unità usi? Che delphi usi? Qual'è il parametro che 
sbagli? E' sbagliata l'istruzione ShellExecute? Perché?
Cavolo, quando avvii la compilazione ce l'hai tutto scritto lì, e non sai 
debuggare un errore così banale? E quando ti capiteranno errori negli 
algoritmi che farai, una visita a Lourdes? Lì mica te lo segnalerà l'errore, 
sai?
Scusa la tirata, ma i tuoi post mi stanno inducendo a pensare a qualche tua 
azione di trollaggio. Mi rassicuri che non sia così?

 ha scritto nel messaggio 
news:442140d0$0$36933$4faf...@reader3.news.tin.it...

Ti rassicuro!!! Stai tranquillo!
Guarda che ti ho risposto e ti ho segnalato dove dà l'errore (forse ti è 
sfuggito di leggere il messaggio :)
Sono anni che scrivo qua e non sono mai stato "sgridato"; non digerisco giù 
il fatto degli "urli" senza leggere attentamente cosa scrivo (cosa che NON 
hai fatto tu).
Buon lavoro.

 grazie per aver provato il mio codice. [...]
Leggendo altri post della discussione, noto che il problema sembra 
presentarsi sul flag SW_NORMAL.
Non vorrei che quel flag fosse disponibile in più unit e che tu, 
malauguratamente, lo stia prelevando dalla unit errata in cui magari ha 
un tipo differente da quello che ci si aspetta.
Quali sono le unit utilizzate? Elenca quanto riportato dalla clausola 
*uses* della unit che contiene il codice incriminato.


Ok, scusami.
Mi è sfuggito l'errore.
Come istruzione utilizza:
ShellApi.ShellExecute
Come parametro utilizza:
Windows.Sw_Normal
Se non funziona così non so più che dirti. 

 "script.txt"    tanto il txt è già associato al notepad...).
Prima aggiungi nella Uses ShellAPI, ...
ShellExecute(Handle, PChar('open'), PChar('Script.txt'), nil, nil, 
sw_ShowNormal) ;
Ciao Giorgio 

 ha scritto nel messaggio 
news:44215e47$0$2272$4faf...@reader4.news.tin.it...

Ahimè non funziona lo stesso :(   (stesso errore)
Grazie lo stesso :) 

 *uses* della unit che contiene il codice incriminato.
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,IniFiles,ExtActns,SHELLAPI,
  Buttons;
Ho provato anche con il flag "SW_SHOWNORMAL", ma non cambia niente,stesso 
errore grrrrrrrr.

 sw_ShowNormal) ;
Stesso problema.
A che santo devo votarmi? :) 

Vi posto il codice dell'intero progetto (eh eh eh una sola unit, ho appena 
iniziato ed ho avuto subito il problema!)
unit Unit1;
interface
uses
  ShellApi,Windows, Messages, SysUtils, Variants, Classes, Graphics, 
Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,IniFiles,ExtActns,
  Buttons;
type
  TfrmMain = class(TForm)
    log: TMemo;
    btSelectFolder: TBitBtn;
    folderpath: TEdit;
    btStartMod: TBitBtn;
    btEditScript: TBitBtn;
    btQuit: TBitBtn;
    procedure btQuitClick(Sender: TObject);
    procedure btEditScriptClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btQuitClick(Sender: TObject);
begin
Close();
end;
procedure TfrmMain.btEditScriptClick(Sender: TObject);
var
script:string;
begin
script:='script.txt';
//shellexecute(Handle,'open','C:\windows\notepad.exe',nil,nil,SW_show);
//ShellExecute(0,nil,PChar(script),nil, nil,SW_NORMAL);
//Shellexecute(0, 'open', Pchar('Cherubinobackup.exe'), nil , 
nil,SW_SHOWMINIMIZED);
//Shellexecute(0,'open','ciao',nil,'c:\',SW_SHOW);
//ShellExecute(Application.Handle, nil, PChar(script), nil, 
nil,SW_SHOWNORMAL);
//ShellExecute(Handle,nil,PChar(script),nil, nil,SW_NORMAL);
//ShellExecute(0, nil, 'cmd.exe', '/c 
fpt.exe -s:c:\ftpscript.txt','',SW_SHOWNORMAL);
//ShellExecute(handle, 'open', 'c:\windows\telnet.exe', nil , nil,
//SW_SHOWNORMAL);
ShellExecute(Handle, PChar('open'), PChar('Script.txt'), nil, 
nil,sw_ShowNormal) ;
ShellApi.ShellExecute(0,'open',PChar(script),nil,nil,Windows.SW_SHOWNORMAL);
//ShellExecute(Handle,'open',
//  'c:\windows\notepad.exe','c:\SomeText.txt',
//  nil, SW_SHOWNORMAL);
end;
end.

 iniziato ed ho avuto subito il problema!) [...]
Compila perfettamente. Il problema è sicuramente dovuto a qualche altro 
fattore.


RISOLTO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ihihihihih
guardate un pò....bastava fare questa modifica...
procedure TfrmMain.btEditScriptClick(Sender: TObject);
var
script:string;
ret:cardinal;
begin
script:='script.txt';
ret:= ShellExecute(Handle, PChar('open'), PChar('Script.txt'), nil, 
nil,sw_ShowNormal) ;
end;
1) Come posso evitare di dover per forza mettere la variabile "ret" ? (c'è 
qualche opzione nel compilatore che è andata a "donne di facili costumi"?)
2) Stranamente si apre il debugger (quello a livello assembler...quello 
bruttissomo "cpu" con tutte le istruzioni assembler) posso evitarlo?
Raga, grazie di esservi "rotti" le scatole con me!

 bruttissomo "cpu" con tutte le istruzioni assembler) posso evitarlo?
Quale versione di Delphi usi e su quale SO?


Delphi 7 su XP sp2
Mi rimane di risolvere il punto 1),   per il punto "2)" ho appena trovato 
che bastava disabilitare "Debug spawned processes" nel Debugger Options.
Per il punto 1) rimane un mistero (anche se mi rompe un pò, posso 
conviverci).
Grazie dell'interessamento.

Bastava abilitare "Extended syntax" :) per risolvere anche l'altro punto.
Ciauz!
(Chissà perchè le opzioni si sono incasinate?!)


Ti confermo, purtroppo, che anche sul mio D7 su XP SP2 il tutto lavora al
meglio, sia chiamando direttamente ShellExecute sia assegnandola alla var
cardinal.
Hai provato a cambiare il flag SW_SHOWNORMAL con ad esempio SW_MAXIMIZE o
qualunque altro tanto per provare? Magari ha ragione Marco...
Inoltre, sarà una str***ata ma ricordo che quando mi ero trovato ad
utilizzare ShellExecute su D5 o D6, non ricordo, anch'io avevo avuto dei
problemi espressamente su NIL che ho dovuto sostituire con ''.
var
    execfpc : pchar;
begin
[cut]
ShellExecute(0,'open',execfpc,'','',SW_SHOWNORMAL);
[cut]
end;
Non lasciare nulla al caso. Prova, semmai resti allo stesso punto.
Ciao
Valter

> Bastava abilitare "Extended syntax" :) per risolvere anche l'altro punto.
Bene !
Che parto !  :-)

Guardando l'ora di questo post e dell'altro noto che scritto prima questo e 
poi l'altro (che mago eh!)
Grazie infinite dell'interessamento!
E' stato proprio un parto, ma ce l'ho fatta!
Ciauz!

 A che santo devo votarmi? :)
A San Digitale!
Nel mio pc funziona, Giorgio