Newsgroup: it.comp.lang.delphi
Titolo: domanda (stupida?) su dll

Rieccomi qui dopo una piccola assenza...
stò sviluppando il solito programma "gestione contabilità". Il software è
composto da una piccola applicazione (host) che gestisce i menu e il sistema
di licensing e accesso da parte degli utenti e da una miriade di dll per i
vari moduli. ho un "piccolo" problema con le dll (spero che sia solo il
caldo...). più precisamente:
dal programma host carico dinamicamente una dll, ad esempio "clienti.dll"
dove ho le mie form per la gestione dei clienti. se dall'interno della dll
"clienti.dll" carico (dinamicamente o staticamente) la dll "comuni.dll" per
gestire le informazioni comune/cap/provincia per il cliente selezionato (si
tratta di un paio di query su un db), ricevo un "access violation", ma solo
alla chiusura dell'host. i dati vengono passadi dalla dll comuni a quelli
clienti senza apparenti problemi. ricapitolando:
host -> clienti.dll -> exit host: nessun problema
host -> clienti.dll -> comuni.dll -> exit host : acces violation
ecco qualche linea di codice per chi volesse darmi una mano.
grazie mille in anticipo !
Giuliano
****
per caricare dinamicamente una dll (la uso per una dozzina di dll diverse
senza il minimo problema):
TStartModule = procedure (Action:integer);stdcall;
procedure TMainForm.loaddll(name,funct:string;action:integer);
// name è il nome della dll
// funct è la funzione della dll da chiamare
// action è il tipo di azione da compiere
var
 Handle:THandle;
 StartModule:TStartModule;
begin
  if fileexists(pchar(path+name)) then
  begin
    Handle := LoadLibrary(pchar(path+name));
    if Handle <> 0 then
    try
      @StartModule := GetProcAddress(Handle, pchar(funct));
      if @StartModule <> nil then
       StartModule(action);
    finally
      FreeLibrary(Handle);
    end;
  end;
end;
funzione richiamata da @StartModule (la uso per una dozzina di dll diverse
senza il minimo problema):
procedure StartClienti(ActionType:integer);stdcall;
var
 ClientiForm:TClientiForm;
begin
 ClientiForm:=TClientiForm.Create(nil);
 ClientiForm.ActionType:=ActionType;
 ClientiForm.Showmodal;
 Clientiform.Destroy;
end;
funzione per la chiamata a comuni.dll
TStartModule = procedure(var comune:pchar; var provincia:pchar; var
cap:pchar);stdcall;
procedure TClientiForm.GetComune;
var
 Handle:THandle;
 StartModule:TStartModule;
 comune,provincia,cap:PChar;
begin
  if fileexists(pchar(path+'Comuni.dll')) then
  begin
    comune:=pchar(comuneedit.text);
    provincia:=pchar(provinciaedit.text);
    cap:=pchar(capedit.text);
    Handle := LoadLibrary(pchar(path+'Comuni.dll'));
    if Handle <> 0 then
    try
      @StartModule := GetProcAddress(Handle, pchar('StartComuni'));
      if @StartModule <> nil then
      begin
       StartModule(comune,provincia,cap);
       comuneedit.text:=comune;
       provinciaedit.text:=provincia;
       capedit.text:=cap;
      end;
    finally
      FreeLibrary(Handle);
    end;
  end;
end;
funzione che avvia comuni.dll
procedure StartComuni(var comune:pchar; var provincia:pchar; var
cap:pchar);stdcall;
var
 ComuniForm:TComuniForm;
begin
 ComuniForm:=TComuniForm.Create(nil);
 ComuniForm.Comune:=Comune;
 ComuniForm.Provincia:=Provincia;
 ComuniForm.Cap:=Cap;
 ComuniForm.Showmodal;
 Comune:=pchar(ComuniForm.Comune);
 Provincia:=pchar(ComuniForm.Provincia);
 Cap:=pchar(ComuniForm.Cap);
end;


L'unica cosa che, a prima vista, non mi piace è qui.
Crei ComuniForm senza passargli un handle, cosa che dovrebbe essere sempre fatta
nelle DLL che utilizzano VCL.
Prova così:
  Application.Handle := GetActiveWindow;
  ComuniForm := TComuniForm.Create(Application);
Meglio ancora passare alla DLL l'handle dall'applicazione principale
procedure StartComuni(var comune:pchar; var provincia:pchar; var
  cap:pchar; AHandle: HWND);stdcall;
Application.Handle := AHandle;
ComuniForm := TComuniForm.Create(Application);
Ciao,
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"

 Application.Handle := AHandle;
non mi sembra che in una dll puoi richiamare Application o almeno io non ci
reisco...


reisco...
Uses Forms;


 Uses Forms;
deve essere proprio il caldo :-)
grazie mille. sembra che funzioni adesso, ma aspetterň fino a domani nel
caso sia un effetto collaterale :-)
giuliano
