Hallo.
Eine "schönes" Interop Problem (ob das hier das richtige Forum ist?!?):
Ich arbeite zur Zeit in einem C++ Projekt und soll externe Libraries ansprechen. Diese sind managed DLLs (vermutlich mit C# geschrieben) (mit einem kleinen unmanaged Teil). Wie vom Hersteller empfohlen spreche ich die Mittels COM an (Registriert mit RegAsm, tlbs importiert). Das wird also mit dem COM Callable Wrapper (CCW) ausgeführt
Das C++ Projekt spricht aber auch mittels einem eigenen C++/CLI Wrapper eigene C# DLLs an. (Das C++ Projekt ist ein uraltes aber immer weiter gepflegtes Monster, in dem alle Sauereien gemacht wurden, die man machen kann - ach ja: es ist ein 32 Bit Projekt).
Wenn ich jetzt mittels COM die externe DLLs aufrufe, habe ich ein Memory Leak im Managed Memory Teil (Native Memory ist OK). In einer Schleife ist das dann tödlich. Egal ob ich mit SmartPointer oder arbeite oder "manuell". Bei Manuell kann ich zumindest den Refcouter ansehen - und der ist nach dem Release Null. Vermutlich führt der CCW keine Garbage Collection aus.
In einem "Minimalbeispiel-Projekt" klappt aber alles einwandfrei - selbst mit den Projektsettings -> es hängt also mit der Konfiguration zusammen.
[highlight=c++]
[..]
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
[..]
CComPtr<IID_YYY> ZZZ;
HRESULT hr = CoCreateInstance(CLSID_XXX, NULL, CLSCTX_INPROC_SERVER, IID_YYY, (void**)&ZZZ);
[..]
for (..) {
CComPtr<AAA> BBB = NULL;
HRESULT res = ZZZ->Get_XYZ([..], &BBB);
[..]
}
[..]
[/highlight]
Kann mir bitte einer einen Hinweis geben, wo ich noch suchen kann? Nach tagelangen Internet durchwühlen habe ich es jetzt aufgegeben
Danke und Grüße
Ralph Erdt
Eine "schönes" Interop Problem (ob das hier das richtige Forum ist?!?):
Ich arbeite zur Zeit in einem C++ Projekt und soll externe Libraries ansprechen. Diese sind managed DLLs (vermutlich mit C# geschrieben) (mit einem kleinen unmanaged Teil). Wie vom Hersteller empfohlen spreche ich die Mittels COM an (Registriert mit RegAsm, tlbs importiert). Das wird also mit dem COM Callable Wrapper (CCW) ausgeführt
Das C++ Projekt spricht aber auch mittels einem eigenen C++/CLI Wrapper eigene C# DLLs an. (Das C++ Projekt ist ein uraltes aber immer weiter gepflegtes Monster, in dem alle Sauereien gemacht wurden, die man machen kann - ach ja: es ist ein 32 Bit Projekt).
Wenn ich jetzt mittels COM die externe DLLs aufrufe, habe ich ein Memory Leak im Managed Memory Teil (Native Memory ist OK). In einer Schleife ist das dann tödlich. Egal ob ich mit SmartPointer oder arbeite oder "manuell". Bei Manuell kann ich zumindest den Refcouter ansehen - und der ist nach dem Release Null. Vermutlich führt der CCW keine Garbage Collection aus.
In einem "Minimalbeispiel-Projekt" klappt aber alles einwandfrei - selbst mit den Projektsettings -> es hängt also mit der Konfiguration zusammen.
[highlight=c++]
[..]
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
[..]
CComPtr<IID_YYY> ZZZ;
HRESULT hr = CoCreateInstance(CLSID_XXX, NULL, CLSCTX_INPROC_SERVER, IID_YYY, (void**)&ZZZ);
[..]
for (..) {
CComPtr<AAA> BBB = NULL;
HRESULT res = ZZZ->Get_XYZ([..], &BBB);
[..]
}
[..]
[/highlight]
Kann mir bitte einer einen Hinweis geben, wo ich noch suchen kann? Nach tagelangen Internet durchwühlen habe ich es jetzt aufgegeben
Danke und Grüße
Ralph Erdt
Comment