Programma si pianta con Shellexecute con ShellApi

di il
9 risposte

Programma si pianta con Shellexecute con ShellApi

Buonasera.Da programma vorrei caricare una lista di indirizzi web,ed aprirli sempre da programma.Uso la Shellexecute,ovvamente con la shellApi,ma quando voglio far aprire il sito, si pianta senza dae errori.Posto il codice e lo Screenshot della form.
implementation
uses ShellApi;
{$R *.dfm}

//quì carico nella Tstringlist i nomi degli indirizzi e li visualizzo nella listbox me

procedure TForm1.Button1Click(Sender: TObject);
var
ts:TSTRINGLIST;
s:string;
I:integer;
begin
getdir(0,s);
TS:=TSTRINGLIST.CReATE;
ts:=Tstringlist.create;
ts.Loadfromfile( S+'\indirizzi.txt');
for i := 0 to ts.Count - 1 do
me.items.Add(ts);
end;

// quando voglio aprire il sito memorizzato su edit1.text, clicco sul Button2 dove c'è la Shellexecute, si pianta.Dov'è l'errore?

procedure TForm1.Button2Click(Sender: TObject);
begin
Shellexecute(Handle,'open',Pchar(edit1.Text),nil,nil,SW_SHOW);
end;

// quì assegno all'edit la scelta slla listbox me
procedure TForm1.meClick(Sender: TObject);
begin
edit1.text :=me.items[me.ItemIndex];
end;
end.

9 Risposte

  • Re: Programma si pianta con Shellexecute con ShellApi

    Quale "URL" di da problemi?
    Probabilmente devi decodificare qualche carattere ... visto così il codice sembra corretto.
  • Re: Programma si pianta con Shellexecute con ShellApi

    Le Url sono le seguenti,cosa intendi per decodificare i carateri?Un nome di Url l'ho messo senza https:// ma nn funziona ugualmente.Anche a me pare corretto il codice, ma non funziona.
    https://www.youtube.com/watch?v=frpYy9uEod
    www.youtube.com/watch?v=B9AAq25MZV
    https://www.youtube.com/watch?v=Ck9uUVJAmw
  • Re: Programma si pianta con Shellexecute con ShellApi

    Pensavo che nel tuo "url" ci fosse qualche carattere che poteva dare fastidio, come spazi o apici doppi, cmq ho appena provato
    
    shellexecute(Handle,'open',Pchar(edit1.Text),nil,nil,SW_SHOW);
    
    con dentro al componente edit1 un tuo url e funziona, dunque lascio la palla a chi ci capisce più di me, mi spiace, ma non so dove andare a sbattere.
    W.

    EDIT: L'unica cosa che mi viene in mente qualche sporcizia, qualche carattere che tiri sul dal file che potrebbe dar fastidio alla shellexecute, prova con il debug a vedere cosa viene passato....
  • Re: Programma si pianta con Shellexecute con ShellApi

    Per capire meglio prova con una costante

    PChar('http://www.google.com')
  • Re: Programma si pianta con Shellexecute con ShellApi

    Mah, ho provato a inserire pchar su "open" - Shellexecute(Handle,pchar('open'),Pchar(edit1.Text),nil,nil,SW_SHOW); e funziona, boh...Io ho w7 32 bit, ma non penso dipenda dal SO,anche perchè uso la delphi 7.Un problema me lo da kaspersky perchè quando voglio aprire il sito con Shellexecute, l'antivirus mi controlla la rete e me lo blocca..La cosa che non capisco, ma è solo per curiosità, è che se apro lo stesso sito manualmente, kaspersky non me lo blocca, da programma sì.Va beh, tengo conto dei suggerimenti, se avrò altri problemi farò sapere.Grazie.
  • Re: Programma si pianta con Shellexecute con ShellApi

    E' giusto che si comporti diversamente dato che sono processi diversi che tentano di aprire il sito.
  • Re: Programma si pianta con Shellexecute con ShellApi

    E' quello che pensavo,ma non so ancora perchè.Anche quando chiamo il sito manualmente uso le rete.Capisco che sono processi diversi ma la chiamata è la stessa, sia da programma che manuale.Ma come dicevo, è solo curiosità.
  • Re: Programma si pianta con Shellexecute con ShellApi

    Se il processo che chiama è diverso il comportamento dell'antivirus DEVE essere diverso, non comprendi ancora?
  • Re: Programma si pianta con Shellexecute con ShellApi

    caviccun ha scritto:


    Uso la Shellexecute,ovvamente con la shellApi,ma quando voglio far aprire il sito, si pianta senza dae errori.
    Prova a salvare il valore contenuto all'interno del controllo Edit in una variabile, prima di invocare la funzione ShellExecute().

    Per intenderci
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      LAddress: string;
    begin
      LAddress := Edit1.Text;
      ShellExecute(Handle, 'open', PChar(LAddress), nil, nil, SW_SHOW);
    end;
    
    Essendo che Text è una proprietà del controllo TEdit, non vorrei che alla funzione giungesse un puntatore PChar a una struttura dati che è diversa da quella tradizionale di una stringa, poiché una proprietà non è l'equivalente di una variabile locale.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
9 risposte