Hi,
ich hab ein COM-Server, der einen Eintrag in die Running Object Table macht...
Beim schliessen des Servers kommt immer eine Warnung:
"Diese Anwendung enthält noch aktive Com-Objekte. Ein oder mehrere Client-Anwendungen können Verweise auf diese Objekte haben. Manuelles schliessen dieser Anwendung könnte dazu führen, dass client-Anwendungen fehlerhaft ausgeführt werden. Sind sie sicher, dass diese Anwendung geschlossen werden soll ? [Ja] [Nein]"
Wie krieg ich die weg ? Es scheint ja so, als hängen noch Objekte am Server oder so... der Quellcode is so:
var
lpROT : IRunningObjectTable;<br>
monikerFilePath : PWideChar;<br>
monikerInterface : IMoniker;<br>
rootStorage: IStorage;<br>
rotKey : integer;<br>
clrKey : integer;<br>
hr: HRESULT;<br>
il: INCC;
begin<br>
CoInitializeEx(nil,COINIT_APARTMENTTHREADED);<br>
monikerFilePath := 'c:\temp\NCCMoniker.id';<br>
hr := CoRegisterClassObject (CLASS_NCC,NCCFactory,CLSCTX_LOCAL_SERVER,REGCLS_M ULTI_SEPARATE,clrKey);<p>
if not succeeded(StgOpenStorage(monikerFilePath, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, rootStorage)) then begin<br>
StgCreateDocFile(monikerFilePath, STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, 0, rootStorage);<br>
WriteClassStg(rootStorage,CLASS_NCC);<br>
end;<p>
rootStorage := nil;<p>
hr := CreateFileMoniker(monikerFilePath,monikerInterface );<br>
hr := GetRunningObjectTable(0,lpROT);<br>
il := CoNCC.Create;<br>
hr := lpROT.Register(ROTFLAGS_ALLOWANYCLIENT or ROTFLAGS_REGISTRATIONKEEPSALIVE, il as IUnknown, monikerInterface, rotKey);<p>
Application.Initialize;<br>
Application.CreateForm(TForm1, Form1);<br>
Application.Run;<br>
hr := lpROT.Revoke(rotKey);<br>
il := nil;<br>
//hr := CoRevokeClassObject(clrKey); // keine ahnung ob das rein muss?..
//ändert jedenfalls nix an der
//Meldung..<br>
end;<p>
Achso...die Warnung kommt noch vor dem Revoke...
Was mache ich denn falsch ? Bitte kann mir jemand helfen ?
Danke schonmal<br>
dinchen
ich hab ein COM-Server, der einen Eintrag in die Running Object Table macht...
Beim schliessen des Servers kommt immer eine Warnung:
"Diese Anwendung enthält noch aktive Com-Objekte. Ein oder mehrere Client-Anwendungen können Verweise auf diese Objekte haben. Manuelles schliessen dieser Anwendung könnte dazu führen, dass client-Anwendungen fehlerhaft ausgeführt werden. Sind sie sicher, dass diese Anwendung geschlossen werden soll ? [Ja] [Nein]"
Wie krieg ich die weg ? Es scheint ja so, als hängen noch Objekte am Server oder so... der Quellcode is so:
var
lpROT : IRunningObjectTable;<br>
monikerFilePath : PWideChar;<br>
monikerInterface : IMoniker;<br>
rootStorage: IStorage;<br>
rotKey : integer;<br>
clrKey : integer;<br>
hr: HRESULT;<br>
il: INCC;
begin<br>
CoInitializeEx(nil,COINIT_APARTMENTTHREADED);<br>
monikerFilePath := 'c:\temp\NCCMoniker.id';<br>
hr := CoRegisterClassObject (CLASS_NCC,NCCFactory,CLSCTX_LOCAL_SERVER,REGCLS_M ULTI_SEPARATE,clrKey);<p>
if not succeeded(StgOpenStorage(monikerFilePath, nil, STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, rootStorage)) then begin<br>
StgCreateDocFile(monikerFilePath, STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, 0, rootStorage);<br>
WriteClassStg(rootStorage,CLASS_NCC);<br>
end;<p>
rootStorage := nil;<p>
hr := CreateFileMoniker(monikerFilePath,monikerInterface );<br>
hr := GetRunningObjectTable(0,lpROT);<br>
il := CoNCC.Create;<br>
hr := lpROT.Register(ROTFLAGS_ALLOWANYCLIENT or ROTFLAGS_REGISTRATIONKEEPSALIVE, il as IUnknown, monikerInterface, rotKey);<p>
Application.Initialize;<br>
Application.CreateForm(TForm1, Form1);<br>
Application.Run;<br>
hr := lpROT.Revoke(rotKey);<br>
il := nil;<br>
//hr := CoRevokeClassObject(clrKey); // keine ahnung ob das rein muss?..
//ändert jedenfalls nix an der
//Meldung..<br>
end;<p>
Achso...die Warnung kommt noch vor dem Revoke...
Was mache ich denn falsch ? Bitte kann mir jemand helfen ?
Danke schonmal<br>
dinchen
Comment