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

    [DELPHI] Passaggio Parametri string a DLL Procedure

    Ciao, ho un form in delphi per .NET, devo richiamare una DLL fatta in delphi per win32.
    la mia procedure richiamata nel form è di questo tipo:
    codice:
    procedure CARD_TO_S(var input:cardinal, var output:string) cdecl;external 'STRMANAGEMENT.DLL'
    nella DLL invece :
    codice:
    procedure CARD_TO_S(var input:cardinal; var output:PWideChar); cdecl; export;
      var appo:String;
      var len:Integer;
      begin
        appo:=IntToStr(input);
        len:=Length(appo);
        StringToWideChar(appo,output,len+1);
      end;
    Il problema è che quando faccio la chiamata alla procedura, devo per forza inizializzare obbligatoriamente la variabile output, altrimenti ricevo un errore run time di access violation. In questo modo
    codice:
    HOURS:='';
    CARD_TO_S(HH,HOURS);
    Come mai? E' possibile risolvere il problema senza per forza doverla inizializzare? Grazie
    ...NO ONE IS INNOCENT ANYMORE...

  2. #2
    ah, non ho detto che a me servirebbe non doverla inizializzare. Ciao!
    ...NO ONE IS INNOCENT ANYMORE...

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Per principio, è sempre bene inizializzare le variabili locali con un valore prima di farne qualsiasi uso, poichè il loro valore è da ritenersi altrimenti sconosciuto.

    Detto questo, bisogna tenere conto del fatto che nella piattaforma .NET le stringhe sono veri e propri oggetti di tipo System.String, quindi dichiarare una variabile di questo tipo all'interno di un qualsiasi metodo equivale ad avere un riferimento possibile ad una stringa che però deve essere dichiarata e allocata.

    Passando parametri ad un secondo metodo, è sempre bene che le variabili siano inizializzate, a meno che tali parametri non siano dichiarati nel metodo chiamato con la direttiva out che segnala al compilatore che è il metodo stesso a farsi carico di inizializzare comunque la variabile.

    Nel tuo caso, richiami funzioni che operano su stringhe, pertanto se non inizializzi tale variabile con un valore hai semplicemente un riferimento nullo ad un oggetto, perciò quando si tenta di accedere alla stringa si ottiene un Access Violation poichè non è valido il riferimento utilizzato.

    Inizializzando la variabile, anche ad una stringa vuota, ottieni la creazione di un'istanza di System.String valida, con valore System.String.Empty, da passare come riferimento valido alla tua routine.

    Nonostante la valorizzazione di stringhe possa sembrare diversa, si tratta di una semplice creazione di un oggetto contenente il valore specificato.

    Secondo me, per evitare di incappare in questi errori, dovresti semplicemente approfondire la conoscenza della piattaforma .NET.

    Il compilatore Delphi.NET è diverso dal compilatore Delphi Win32; nonostante sia molto tollerante sul codice permettendoti spesso di trasportare da un "universo" all'altro il tuo codice sorgente, ci sono alcune considerazioni architetturali riguardo .NET che richiedono accorgimenti non necessari in Win32, e viceversa.

    Per conoscere la maggior parte di questi "ostacoli", si deve studiare la piattaforma .NET; una volta acquisita una formazione sufficiente, Delphi sarà semplicemente un linguaggio famigliare ed elegante per poter sviluppare su questa piattaforma senza doversi imparare da capo una nuova sintassi o abbandonare le proprie conoscenze passando a Visual Studio.NET (vade retro!)

    Sono stato prolisso...spero di aver spiegato bene tutto quanto.

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

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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.