Newsgroup: it.comp.lang.delphi
Titolo: Problema con dll

ciao a tutti
Se da un'applicazione chiamo una funsione contenuta in una dll e la dll non
esite all'avvio del programma mi dá errore, ma visto che c'é questa
possibilitá come posso fare?
ciao
erik


Allora: prima di tutto dichiari un nuovo tipo:
type
  TFunzioneParametro = function: PChar; stdcall;
e poi una serie di parametri di tipo TFunzioneParametro tanti quante sono le
funzioni che la dll esporta:
  miafunzione1: TFunzioneParametro;
  miafunzione2: TFunzioneParametro;
  ...
Nella FormShow controlli che la dll esista: dichiari una variabile
    fDllHandle: THandle;
ed effettui il test:
    fDllHandle  := LoadLibrary('miadll.dll');
    if fDllhandle = 0 then
    begin
        MessageDlg('DLL non presente', mtError, [mbOk], 0);
        Exit;
    end;
Se il test invece ha avuto esito positivo:
    MiaFunzione1 := GetProcAddress(fDllHandle, 'FunzioneEsterna1');
    MiaFunzione2 := GetProcAddress(fDllHandle, 'FunzioneEsterna2');
dove FunzioneEsterna1 e FunzioneEsterna2 sono i metodi esportati dalla dll.
Volià. Saluti.
        Marco Bortolani
        info at 
marcobortolani.it

 > Nella FormShow controlli che la dll esista: dichiari una variabile
imho, questa cosa non è molto corretta.
Meglio farlo sulla OnCreate.
A

"Marco Bortolani"  ha scritto nel messaggio
[cut]
Premetto che ho lavorato poco con i tipi ...
ti posto il codice(semplice esempio) cosí puoi dirmi dove sbaglio
Questa é la dll :
library Project1;
uses
  SysUtils,
  Classes,Dialogs;
{$R *.res}
Function UpTxt(s:string):string;
begin
result:=UpperCase(s);
end;
Procedure SendMessage(s:string);
begin
ShowMessage(s);
end;
Exports
UpTxt,
SendMessage;
end.
Questo é l'exe :
type
  TFunzioneParametro = function(s:string):String; stdcall;
TProcedureParametro = Procedure(s:String); stdcall;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    MiaFunzione1: TFunzioneParametro;
    MiaProcedura1:TProcedureParametro;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
fDllHandle: THandle;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
    fDllHandle  := LoadLibrary('E:\Programmi\Borland\Delphi7\Projects\dll
prova\Project1.dll');
    if fDllhandle <> 0 then
    begin
      MiaFunzione1 := GetProcAddress(fDllHandle, 'UpText');
      Edit1.Text:=MiaFunzione1('pippo');
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if fDllhandle <> 0 then
MiaProcedura1 := GetProcAddress(fDllHandle, 'SendMessage');
MiaProcedura1('ciao');
end;
end.
La dll la carica ma non riesco ad eseguire le funsioni/procedure
grazie
erik

Anche io non uso gran chè le dll ma quello che ti ho postato funziona.
Controlla l'uso di parametri di tipo String:
 ... ShareMem must be the first unit in your library's USES clause AND your
project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. ...
Invece di usare degli String, guarda se puoi usare i PChar:
function UpTxt(s: PChar): PChar;
Il codice chiamante infine mi pare corretto: vedi se risolvi sistemando la
dll.
Saluti
        Marco Bortolani
        info at 
marcobortolani.it
P.S.
Faccio tesoro del consiglio di Alberto ("Questa cosa non è molto corretta.
Meglio farlo sulla OnCreate.") e te lo ribadisco anch'io: il test
sull'esistenza della dll fallo sull'OnCreate del form principale e non sul
suo Show.

Meglio farlo sulla OnCreate.
Io  farei una Unit aposita che interfaccia la DLL e poi chimerei nel
main { File di progetto, il dpr insomma } una funzione della unit tipi
Load<nomeDLL> : Boolean o qualcosa del genere cosi con un if not
Load<nomeDLL. Puoi anche solevare una bella eccezione se vuoi { anche
se non avrebbe molto senso :D }
Oppure potresti solevarla all'interno della funzione Load<ecc> sensa
fargli restituire nulla cosi fai un bel blocco Try dove alla fine
dealochi la DLL
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
ICQ     : 67552596
-----------------------------------------------
Founder of MediaPlayer Project
http://mpp.iwebland.com