Zitat von
MaBuSE:
Wenn's fertig ist, werde ich hier die Lösung posten.
Es funktioniert nun.
Die Komponente TWebBrowser verwendet eine
Unit, die den InitProc-Pointer auf eine eigene Procedure setzt. Application.Initialize prüft ob der Zeiger gesetzt ist und ruft dann diese Procedure auf.
Delphi-Quellcode:
procedure TApplication.Initialize;
begin
if InitProc <> nil then TProcedure(InitProc);
end;
Da in einer
DLL dieser Zeiger nicht gesetzt wird, kommt es zu diesem Fehler.
Delphi-Quellcode:
if not IsLibrary then
begin
SaveInitProc := InitProc;
InitProc := @InitComObj;
end;
Dummerweise ist die Procedur InitComObj nur im implementation Teil der
Unit definiert.
Sie lässt sich also nicht direkt aufrufen. Deshalb habe ich meiner
Unit folgenden initialization Abschnitt hinzugefügt. (Sollte nur ein mal im Programmstehen.)
Folgenden Quelltext habe ich in die Unit1.pas aufgenommen:
Delphi-Quellcode:
...
// In ComObj wird der InitProc verbogen, aber nur wenn keine DLL :-(
// : if not IsLibrary then
// : begin
// : SaveInitProc := InitProc;
// : InitProc := @InitComObj;
// : end;
// Leider ist InitComObj nur lokal in der implementation definiert,
// deswegen hier dieses manuelle Init
var
NeedToUninitialize: Boolean;
initialization
//InitComObj;
if (CoInitFlags <> -1)
and Assigned(ComObj.CoInitializeEx)
then
begin
NeedToUninitialize := Succeeded(ComObj.CoInitializeEx(
nil, CoInitFlags));
IsMultiThread := IsMultiThread
or
((CoInitFlags
and COINIT_APARTMENTTHREADED) <> 0)
or
(CoInitFlags = COINIT_MULTITHREADED);
// this flag has value zero
end
else
NeedToUninitialize := Succeeded(CoInitialize(
nil));
//--InitComObj
finalization
if NeedToUninitialize
then CoUninitialize;
end.