Newsgroup: it.comp.lang.delphi
Titolo: Windowx XP - SafeLoadlibrary - Windows error code 487

Un saluto a tutti.
Occasionalmente, al tentativo di caricare una DLL scritta in delphi usando SafeLoadLibrary GetLastError restituisce questo codice di errore.
Manco a dirlo, cercando su google non si trova un kazzen di utile su questa cosa strana.
Exe e dll coinvolti sono scritti in delphi.
 
Quello che fa ..zzzare e' che non capita sempre.
Magari per 2 giorni non lo fa e poi improvvisamente inizia a venir fuori.
 
Il codice è banale:
 
var
  ErrorCode: integer;
 
begin
  FHandle := SafeLoadLibrary('mydll.dll');
  ErrorCode := GetLastError;
  if ErrorCode <> 0 then
  begin
    Log('error on loading library:' + IntToStr(ErrorCode);
  end;
end;
 
A.

Allora l'errore 487 significa che un indirizzo non � valido, 
praticamente l'indirizzo di ritorno da SafeLoadLibrary non � tra gli 
indirizzi validi.
Dovresti provare a non usare SaveLoadLibrary ma la LoadLibrary standard.
L'help di SafeLoadLibrary non � molto chiaro ma se cerchi con Google ci 
sono molti casi di errori strani con quest'ultima

Prima di tutto, grazie. 
 
Questo frammento e' di delphi7:
 
function SafeLoadLibrary(const Filename: string; ErrorMode: UINT): HMODULE;
var
  OldMode: UINT;
  FPUControlWord: Word;
begin
  OldMode := SetErrorMode(ErrorMode);
  try
    asm
      FNSTCW  FPUControlWord
    end;
    try
      Result := LoadLibrary(PChar(Filename));
    finally
      asm
        FNCLEX
        FLDCW FPUControlWord
      end;
    end;
  finally
    SetErrorMode(OldMode);
  end;
end;
 
 
Asm non lo conosco e quindi non so dire se quel codice puo' portare problemi.
Qualcuno che conosco ASM sa spiegare ad uno con il QI di Gasparri che kaz fa quel codice?
 
A parte cio, safeloadlibrary cmq chiama loadlibrary.
Quindi, o il codice ASM fa qualcosa che manda tutto ai festini del nano oppure non so.
 
 
A.
 
 
 
A.
 
 
 
 
 

FNSTCW  Memorizza una Word come valore di default
FNCLEX	Resetta la lista delle eccezioni
FLDCW	Carica una Word di controllo
 
Praticamente azzera le eccezioni e ne pone una di default (FPUControlWord)
 
Praticamente legge l'ultima modalit� di errore e vi setta quella passata 
(occhio che non � inizializzata - tu che gli passi?), poi memorizza un 
valore di controllo, carica la libreria e, in caso di errore pone il 
valore memorizzato prima come codice di errore e rilascia la modalit� di 
errore.
 
Ci sono due cose che non mi quadrano in questo codice
 
1) ErrorMode non � inizializzato
2) FPUControlWord non � inizializzato
 
Sinceramente userei LoadLibrary e basta

Errore di fretta....
 
ErrorMode � inizializzato a SEM_NOOPENFILEERRORBOX e non mostra un 
messaggio di errore se non trova il file ma, io lo porrei a
SEM_NOOPENFILEERRORBOX Or SEM_NOALIGNMENTFAULTEXCEPT ovvero in sistemi a 
64 bit fissa l'allineamento in memoria dei dati

Il codice di safeloadlibrary che ho postato è lo standard di d7e.
 
 
A.


Si � identico al 2006 ma se noti nella parte interface � dichiarato cosi'
 
function SafeLoadLibrary(const FileName: string;
   ErrorMode: UINT = SEM_NOOPENFILEERRORBOX): HMODULE;
 
mentre nell'implementation cosi'
 
function SafeLoadLibrary(const Filename: string; ErrorMode: UINT): HMODULE;
 
per cui l'inizializzazione c'e'