
Zitat von
ralfiii:
Any ideas?
Ja, ist Problem beim Aufruf von DLLRegisterServer, hier wird die Library ganz normal in den Adressraum des registrierenden Prozesses geladen. Es werden die Standard Initialisierungen durchgeführt, OnCreateXX, Initialization, etc.
Wenn hier also Code ausgeführt wird, der zu diesem Zeitpunkt eigentlich noch nicht laufen sollte, z.B. wegen UnlodLibrary.
Dann kracht's.
Abhilfe:
1. Alle Initialisierungen in eine eigene aufzurufende Prozedure packen, oder nur dann Initialisierung durchführen,
wenn nicht DLLRegisterServer aufgerufen wurde.
2. Eigenen robusteren Loader verwenden.
Anbei Loader, der dementsprechend fehlertolerant ist.
Delphi-Quellcode:
program laregsvr;
uses
windows,
SysUtils;
type
TRegProc =
function: HRESULT;
stdcall;
function SafeLoadLibrary(
const Filename:
String; ErrorMode: UINT): HMODULE;
var
SaveErrorMode: UINT;
SaveFPUControlWord: Word;
begin
SaveErrorMode := SetErrorMode(ErrorMode);
try
asm FNSTCW SaveFPUControlWord
end;
try
Result := LoadLibrary(PChar(Filename));
finally
asm
FNCLEX
FLDCW SaveFPUControlWord
end;
end;
finally
SetErrorMode(SaveErrorMode);
end;
end;
procedure RegisterAxLib(FileName:
string; RegAction:
string);
var
RegProc: TRegProc;
DLLHandle: THandle;
bOK: boolean;
begin
bOK := false;
try
DLLHandle := SafeLoadLibrary(FileName, SEM_FAILCRITICALERRORS
or
SEM_NOGPFAULTERRORBOX
or SEM_NOALIGNMENTFAULTEXCEPT
or
SEM_NOOPENFILEERRORBOX);
if DLLHandle <> 0
then begin
try
@RegProc := GetProcAddress(DLLHandle, PChar(RegAction));
bOK := ((@RegProc <>
nil)
and (RegProc = 0));
finally
FreeLibrary(DLLHandle);
end;
end;
except
Halt(10000);
end;
if bOK
then Halt(0)
else Halt(12000);
end;
begin
RegisterAxLib(ParamStr(1), ParamStr(2))
end.
Aufruf mit RegisterAxLib('c:\myaxlib.dll', 'DllRegisterServer');
Wenn errorcode 0 dann ok, ansonsten Fehler.
lg. Astat