Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [DELPHI] Variabili stringa e variabili PAnsiChar

    Salve, ho un quesito riguardante l'istruzione ShellExecute, che consente di lanciare un applicativo indicando il suo percorso.

    Dunque, per lanciare la calcolatrice di Windows, utilizzo il seguente codice, dopo aver dichiarato SHELLAPI in USES:

    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShellExecute(0,nil,'CALC.EXE',nil,nil,1);
    end;
    Il mio problema è che, se io creo una variabile stringa contenente il percorso del file da aprire, il programma genera un errore. Ad es., il seguente codice non funziona:

    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    
    var
    MioFile:String;
    
    begin
    
      MioFile := ExtractFilePath(application.exename) + '\Lettera.doc';
      ShellExecute(0,nil,MioFile,nil,nil,1);
    
    end;
    L'errore generato riguarda il tipo di variabile, che non deve essere di tipo Stringa ma di tipo PAnsiChar.

    La mia domanda è, quindi, la seguente: esiste un modo per convertire una variabile stringa in una di tipo PAnsiChar? Oppure: in che modo va dichiarato il percorso del file da aprire per evitare l'errore?

    Grazie in anticipo.
    http://www.espositosoftware.it

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Le funzioni API generalmente si aspettano valori di tipo PAnsiChar, cioè puntatori a stringhe "null terminated" di caratteri di tipo ANSI (di cui esiste la controparte PWideChar, riferita a funzioni che lavorano su stringhe Unicode); il tipo generico PChar è un alias del tipo genericamente più utilizzato al momento PAnsiChar precedentemente descritto.

    Il tipo String di Delphi ha una rappresentazione binaria particolare in memoria che consente a Delphi di gestire automaticamente il tipo, contandone i riferimenti e svolgendo altre operazioni che rientrano nell'ottica del "memory management" di quel tipo di dato e di un altro insieme ristretto di tipi sottoposti alla stessa gestione.

    Quando una funzione API richiede un PChar, cioè un PAnsiChar, è necessario quindi provvedere alla conversione del tipo String in quel tipo di dato richiesto dalla funzione.

    La bella notizia è che Delphi è in grado di svolgere autonomamente questa conversione con una semplice operazione di "casting".

    Riprendendo il tuo esempio, è sufficiente scrivere

    codice:
      MioFile := ExtractFilePath(Application.ExeName) + '\Lettera.doc';
      ShellExecute(0, nil, PChar(MioFile), nil, nil, 1);
    e il gioco è fatto.

    Delphi provvede automaticamente a creare un buffer "al volo" compatibile con il tipo che la funzione API si aspetta, e passa il puntatore PChar alla funzione che lo utilizza per i propri scopi.

    Al di là della semplicità della soluzione, c'era comunque posto per un po' di "background" sui dettagli implementativi operati da Delphi, tanto per sapere in quale modo si ottengono certe "magie"...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Grazie, Alka, sia per la soluzione del problema (funziona a meraviglia!) sia per l'esauriente spiegazione.
    http://www.espositosoftware.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.