Newsgroup: it.comp.lang.delphi
Titolo: Passaggio parametri a DLL

Ciao a tutto il ng.
Ho un problema (ma guarda un po') che molto probabilmente (anzi sicuramente)
dipende da un mio errore.
Innanzi tutto le info essenziali:
Delphi 5 su Win2000.
In un programma richiamo una funzione da una DLL sempre scritta da me.
Alla chiamata di questa funzione mi viene sollevata un eccezione di "Invalid
pointer operation", ma solo se avvio il programma nel debugger. Se invece lo
avvio normalmente non viene sollevata l'eccezione ma, ovviamente, la
funzione non "funziona" :).
Debuggando un po sono giunto alla conclusione che il problema sta nel
passaggio della variabile di tipo TStruttura che, evidentemente, non viene
passata correttamente.
Allego gli stralci di sorgente interessati.
-----------------------Programma----------------------
unit StMain;
interface
uses
  Windows, Messages, ecc. ecc.
type
  TStruttura = record
    A: String;
    B: String;
    C: String;
    ......
    ......
end;
type
  TMainForm = class(TForm)
    StatusBar1: TStatusBar;
    MainMenu1: TMainMenu;
    OpenDialog1: TOpenDialog;
    File1: TMenuItem;
    ...........
    ...........
  private
    { Private declarations }
  public
    Variab: TStruttura;
    { Public declarations }
  end;
var
  MainForm: TMainForm;
implementation
{$R *.DFM}
................
................
procedure TMainForm.Button1Click(Sender: TObject);
type
    TSt6GetRegisterDef = function(Output: TStrings; DefVar: TStruttura):
Boolean;
var
   DllRes: THandle;
   GetRegDef: TSt6GetRegisterDef;
   Temp: TStringList;
   mVar: TStruttura;
begin
     //Ovviamente questo e' un esempio semplificato
     //senza gestione errori ecc.
     //La DLL viene caricata correttamente e la funzione viene trovata.
     DllRes := LoadLibrary(PChar('Miadll.dll');
     @GetRegDef := GetProcAddress(DllRes,PChar('St6GetRegisterDef'));
     Temp := TStringList.Create;
     GetRegDef(Temp,Variab); <--Invalid pointer operation
     Temp.SaveToFile('Miofile.txt');
     Temp.Free;
     FreeLibrary(DllRes);
end;
end.
---------------------------------------------------------
-----------------------------DLL-------------------------
library St6res;
uses
  SysUtils,
  Classes;
type
  TStruttura = record
    A: String;
    B: String;
    C: String;
    ......
    ......
end;
function St6GetRegisterDef(Output: TStrings; DefVar: TStruttura): Boolean;
var
   Temp: TStringList;
begin
     //Qui arriva il puntatore "DefVar" NON VALIDO
     //mentre Output che e' un TStrings arriva regolarmente
     //infatti riesco a lavorarci
     Temp := TStringList.Create;
     ..............
     MyFunct(DefVar, Temp);
     ..............
     ..............
     Temp.Free;
end;
exports
  St6GetRegisterDef;
{$R *.RES}
begin
end.
--------------------------------------------------------
Molto probabilmente ho fatto una bestiata io, ma visto che non sono certo un
esperto di Delphi vi prego di avere pazienza.
Ringrazio anticipatamente tutti quelli che vorranno aiutarmi.
Ciao, Marco.

 dipende da un mio errore.
Può dipendere dal Memory Manager di Borland. Quando crei una nuova Dll nel
file di progetto ti aggiunge un commento abbastanza esaustivo su come
comportarsi nel caso tra i parametri delle funzioni esportati ce ne siano di
tipo string.
Ciao.
Gianluca


Ma io non passo le stringhe direttamente nei parametri, passo solamente il
puntatore a una struttura record che contiene delle stringhe.
Dici che e' lo stesso?
Ciao, Marco.