Newsgroup: it.comp.lang.delphi
Titolo: Conflitto con versioni differenti di una dll

Ho un pgm che (per motivi che non sono ancora riuscito a capire) con una
data versione di una dll funziona perfettamente, mentre con una versione di
per se piu' recente da' dei problemi (si tratta di msado15.dll).
E' possibile fare in modo che il pgm invece di puntare alla dll installata
correntemente sul pc (e che non voglio toccare in alcun modo per evitare
problemi di compatibilita' con altri pgm o addirittura problemi con il S.O.)
punti alla stessa dll ma di versione differente posta magari nella stessa
cartella del pgm.
Per essere piu' chiaro il percorso della dll in questione e' solitamente
c:\programmi\file comuni\system\ado\msado15.dll (versione 2.70.9001.0),
mentre io potrei avere l'altra in c:\pgmaf\exe\msado15.dll (versione
2.51.5303.0) e essere sicuro che il pgm utilizzera' questa seconda dll (che
mi assicura stabilita' al pgm) e non quella gia' presente sul sistema.
Grazie per aver letto il mio messaggio e buon anno anche se in ritardo
(torno oggi al lavoro!).

Gigamax wrote:
[CUT]
Se non sbaglio, dovrebbe essere sufficiente mettere la dll che funziona 
nella cartella dell'eseguibile poichè al momento di caricarla la cerca 
prima nella sua cartella e poi in quelle presenti nella Path di sistema.
Come alternativa (ma non credo che ne valga la pena) la carichi e scarichi 
"a mano".
-- 
Ciao,
   Stefano
"Ho smesso di essere presuntuoso quando ho scoperto di essere perfetto"

Segui il suggerimento di Stefano C., ma sappi devi assolutamente cercare di 
capire perche' con la dll piu' recente hai questi problemi.
Imho potrebbe essere un componente che ha bisogno di essere aggiornato.
Ti porto l' esempio di una mia applicazione che utilizza TBetterAdoDataset: ho
dovuto aggiornare l'MDAC almeno alla 2.6 su ogni macchina dove il programma e' stato installato.
Ciao
Morde.
morde [at] programmer [.] net

 "a mano".
La prima opzione non da' risultati (pensavo la stessa cosa!), poi cosa
intendi per caricare e scaricare a mano?
Grazie, Massimiliano

 poi cosa intendi per caricare e scaricare a mano?
Intendo caricare esplicitamente la dll. Eccoti l'esempio tratto dal 
capitolo 6 del libro Borland Delphi 6 Developer's Guide.
unit MainFfm;
interface
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;
type
  { First, define a procedural data type, this should reflect the
    procedure that is exported from the DLL. }
  TShowCalendar = function (AHandle: THandle; ACaption: String):
  TDateTime; StdCall;
  { Create a new exception class to reflect a failed DLL load }
  EDLLLoadError = class(Exception);
  TMainForm = class(TForm)
    lblDate: TLabel;
    btnGetCalendar: TButton;
    procedure btnGetCalendarClick(Sender: TObject);
  end;
  var
    MainForm: TMainForm;
implementation
  {$R *.DFM}
procedure TMainForm.btnGetCalendarClick(Sender: TObject);
var
  LibHandle : THandle;
  ShowCalendar: TShowCalendar;
begin
  { Attempt to load the DLL }
  LibHandle := LoadLibrary(‘CALENDARLIB.DLL’);
  try
  { If the load failed, LibHandle will be zero.
    If this occurs, raise an exception. }
    if LibHandle = 0 then
    raise EDLLLoadError.Create(‘Unable to Load DLL’);
    { If the code makes it here, the DLL loaded successfully, now obtain
      the link to the DLL’s exported function so that it can be called. }
    @ShowCalendar := GetProcAddress(LibHandle, ‘ShowCalendar’);
    { If the function is imported successfully, then set
      lblDate.Caption to reflect the returned date from
      the function. Otherwise, show the return raise an exception. }
    if not (@ShowCalendar = nil) then
      lblDate.Caption := DateToStr(ShowCalendar(Application.Handle, 
Caption))
    else
     RaiseLastWin32Error;
  finally
    FreeLibrary(LibHandle); // Unload the DLL.
  end;
end;
end.
In questo modo puoi controllare quale CALENDARLIB.DLL (o come si chiama la 
tua dll) stai caricando.
-- 
Ciao,
   Stefano
"Ho smesso di essere presuntuoso quando ho scoperto di essere perfetto"
"Prima di parlare assicurati che quello che hai da dire sia più importante 
del silenzio"

capitolo 6 del libro Borland Delphi 6 Developer's Guide.
Scusa, dove si trova il codice? Ho D6 pro, i manuali in italiano, ma non ricordo dove/se
si trovano i sorgenti degli esempi... forse on line su borland?


Morde wrote:
[CUT]
Ho il pdf.
