Newsgroup: it.comp.lang.delphi
Titolo: errore rasman.dll D4 NT4

ho una applicazione che comprende la unit ras.pas di interfaccia con le 
API per utilizzare l'accesso remoto, lanciandola su macchine con NT4 dove 
il RAS non è installato l'applicazione non parte: "DLL non inizializzata" 
come posso raggirare il problema? 
Commentando la chiamata alle funzioni (RasDial, RasHangUp etc) il 
programma parte, ma come faccio a discriminare??
grazie, urge..
AnDrEa BeLeTti - 
http://www.scodellamelo.it
--- posted by geoForum on 
http://www.delphiedintorni.it

loadlibrary invece di dichiarazioni external?
Bye
A

potresti essere un pelo piů chiaro? 
nel mio codice uso a seconda dei vari bottoni le varie funzioni contenute 
nella unit ras.pas di interfaccia con le api e nella unit ras.pas vedo 
che ci sono i riferimenti al rasapi32.dll 
quando il programma parte compila comunque tutto e in esecuzione cerca 
comunque quella maledetta DLL che se in NT4 non č installata impedisce 
l'avvio del programma.
dove dovrei usare il LoadLibrary?
Belloccio, 
http://www.scodellamelo.it


puoi essere più chiaro?
nella mia unit uso i vari bottoni per le chiamate alle funzioni (rasdial, 
rasgetentrydialparams etc) che sono contentute nella ras.pas che è 
l'interfaccia con le api.
dentro la ras.pas vedo che fa riferimento alla rasapi32.dll
in compilazione però il mio exe si compila tutto e su nt4 dove il ras non 
è configurato, lo cerca, non lo trova e non parte
dove e come lo uso il loadlibrary?
Belloccio, 
http://www.scodellamelo.it


puoi essere più chiaro?
nella mia unit uso i vari bottoni per le chiamate alle funzioni (rasdial, 
rasgetentrydialparams etc) che sono contentute nella ras.pas che è 
l'interfaccia con le api.
dentro la ras.pas vedo che fa riferimento alla rasapi32.dll
in compilazione però il mio exe si compila tutto e su nt4 dove il ras non 
è configurato, lo cerca, non lo trova e non parte
dove e come lo uso il loadlibrary?
Belloccio, 
http://www.scodellamelo.it


puoi essere più chiaro?
nella mia unit uso i vari bottoni per le chiamate alle funzioni (rasdial, 
rasgetentrydialparams etc) che sono contentute nella ras.pas che è 
l'interfaccia con le api.
dentro la ras.pas vedo che fa riferimento alla rasapi32.dll
in compilazione però il mio exe si compila tutto e su nt4 dove il ras non 
è configurato, lo cerca, non lo trova e non parte
dove e come lo uso il loadlibrary?
Belloccio, 
http://www.scodellamelo.it


Tu usi un riferimento statico alla dll quando dichiari una funzione
external.
In questo modo alla partenza lui cerca la dll esterna e se non la trova, si
inkazza.
Ma esiste un altro modo di usare una dll assegnando a runtime i puntatori
alle funzioni che ti servono.
In pratica, usi la api LoadLibrary per istanziare la dll.
Questa api ti ritorna un hanld eche puoi usare come parametro per la api
getprocAddress insieme al nome della funzione che tio serve.
L'unica cosa è che devi dichiararti un tipo pointer procedurale
corrispondente al prototipo delle funzioni che devi richiamare e poi
dichiarare delle variabili di questo tipo ai quali assegni poi cio che viene
restituito dalle varie chiamate a getprocaddress.
altri riferimenti li trovi:
1) guida sdk di Windows, api GetProcAddress e LoadLibrary/LoadLibraryEx
2) esempi forniti con delphi
Bye
A

function LoadLibrary(lpLibFileName: Pchar): HMODULE; stdcall;
Questa funzione carica il modulo della DLL specificato da lpLibFileName
e lo mappa
nello spazio di indirizzamento del processo chiamante. In caso di
terminazione con
successo, questa funzione restituisce un handle al modulo, mentre in
caso di fallimento
restituisce il valore 0 ed è sollevata un’eccezione. Puoi vedere
LoadLibrary sulla guida in
linea per ulteriori dettagli sulla funzionalità e sui possibili valori
d’errore di ritorno.
FreeLibrary è definita nel seguente modo:
function FreeLibrary(hLibModule: HMODULE):BOOL; stdcall;
FreeLibrary decrementa il contatore delle istanze della libreria,
definito da LibModule,
quindi rimuove la libreria dalla memoria nel caso il suo contatore di
istanze sia uguale a
zero. Il contatore di istanze tiene traccia del numero di task che
stanno usando la DLL.
GetProcAddress è definita nel seguente modo:
function GetProcAddress(hModule: HMODULE;lpProcNamr:LPCSTR):FARPROC;
stdcall;
GetProcAddress restituisce l’indirizzo di una funzione contenuta nel
modulo specificato
dal parametro hModule, che è un THandle ottenuto attraverso una chiamata
a
LoadLibrary. In caso di errore, GetProcAddress restituisce nil. Per
ottenere
ulteriori informazioni sul tipo di errore si deve chiamare GetLastError.
Esempio:
Nella DLL si trova la funzione 
function Maggiore(FirstNumber, SecondNumber: Integer): Integer; 
prima di tutto devi definire un tipo di dato procedurale, questo deve
rispecchiare la
dichiarazione della funzione che è esportata dalla DLL...
type
...
...
  TMaggiore = function (FirstNumber, SecondNumber: Integer): Integer;
StdCall;
  // procedi allo stesso modo per tutte le altre funzioni....
...
...
procedure TMainForm.Button1Click(Sender: TObject);
var
  LibHandle : THandle;
  Maggiore: TMaggiore; // OCCHIO QUI. ti crei una variabile di tipo
TMaggiore
begin
  { Proviamo a leggere la DLL... }
  LibHandle := LoadLibrary(‘TEST.DLL’); // CARICHI LA DLL
  try
    { Se si verificherà un errore LibHandle sarà uguale a zero }
    if LibHandle = 0 then
    begin
      // qui gestisci l'eccezione
      raise Exception.blablalbla....
    end;
 
    { ora cerchiamo di ottenere il link alla procedura esportata... }
    @Maggiore := GetProcAddress(LibHandle, ‘Maggiore’); // LINKI ALLE
SUE FUNZIONI
    { Se la funzione viene importata correttamente, possiamo
utilizzarla... }
    if not (@Maggiore = nil) then
      Caption := IntToStr(Maggiore(1, 2))
    else
      RaiseLastWin32Error;
  finally
    FreeLibrary(LibHandle); // FREE DELLA DLL.
  end;
end;
Per comodità ho messo il tutto dento un metodo della form....
E' ovvio che non devi aprire e chiudere la DLL ogniqualvolta devi
accedervi...
Ma a questo provvederai senz'altro tu stesso...
bye
  Alessandro Storniolo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG