Hallo Leute, ich habe ein Problem mit einem simplen FolderBrowserDialog in C++. Ich erzeuge einen Dialog in einem COM server (out-of-process). Nun habe ich beim Beenden des servers immer dann eine Heap-Fehlermeldung, wenn ich im server ein ShowDialog() aufgerufen habe... Dies scheint ein Problem zu sein, das bekannt ist (siehe hier). Nun wollte ich diesem link folgend die dispose() Methode aufrufen, allerdings bekomme ich vom compiler gesagt:
'Dispose': Ist kein Element von 'System::Windows::Forms::FolderBrowserDialog'
Bitte häh??? Ich weiss nun echt nicht mehr weiter. Laut obigem link gehe ich davon aus, dass mit einem freigeben des Speichers das Problem gelöst wäre, aber ich weiss nicht, wie ich dies ohne Dispose erreiche...!?! Any ideas? Hier ein code-Schnipsel:
Kannst Du mal noch den Code des Dispose-Aufrufes posten? Da ist irgendwas sehr merkwürdig, denn Dispose ist natürlich ein Member von FolderBrowserDialog.
Mir ist gerade aufgefallen, dass der compiler in der obigen Fehlermedlung noch auf diese dll verweist: c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll Das scheint mir das Framework 2.0 zu sein... Kann es daran liegen? Wie bringe ich den compiler dazu, das Framework 4.0 zu nehmen?
In den Eigenschaften des C++-Projektes wird die Windows-Forms-DLL referenziert. Dort müßtest Du die richtige Version auswählen bzw. dafür Sorge tragen, dass .NET 4 als Zielruntime ausgewählt ist.
Ok, damit hab ich mich nie herumgequält. Es wird aber auch dort irgendwo eine Stelle geben, wo dem Compiler die Referenz auf die WinForms-Assembly mitgeteilt wird.
Auf die Beantwortung dieser Frage war ein Kopfgeld in Höhe von 50 Reputationspunkten ausgesetzt.
Das Kopfgeld wurde bereits vergeben.
1 Antwort
1
Hm, wieder was gelernt...
Man kann die Dispose()-Methode in C++ nicht direkt aufrufen - grob gesagt, weil es in C++ Destruktoren gibt und die Semantiken sich überschneiden. Stattdessen müßtest Du wohl delete benutzen. Die Fehlermeldung des Compilers allerdings ist - nun ja...
If your type has a destructor, the compiler will generate a Dispose method that implements IDisposable. If a type authored in Visual C++ with a destructor is consumed from another language, calling IDisposable::Dispose on that type will cause the type's destructor to be called. When consumed from a Visual C++ client, you cannot directly call Dispose; call the destructor instead using the delete operator.
Hmm, ok, soviel zu dem Dispose(). Danke. Leider löst das delete mein eigentliches Problem nicht. Damit hatte und habe ich es auch schon probiert. Es gibt noch immer einen Absturz beim Beenden des servers, wenn ich zuvor ein ShowDialog() aufgerufen hatte... Hast du / Hat jemand hierzu noch eine Idee?
fbd->Dispose();
c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll
Das scheint mir das Framework 2.0 zu sein... Kann es daran liegen? Wie bringe ich den compiler dazu, das Framework 4.0 zu nehmen?