| 

.NET C# Java Javascript Exception

3
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:

...
FolderBrowserDialog^ fbd = gcnew FolderBrowserDialog();
fbd->Description = "MAS Open dialog";
fbd->RootFolder = Environment::SpecialFolder::MyComputer;
fbd->SelectedPath = Str;
...
res = fbd->ShowDialog(gcnew WindowWrapper(hwnd));
...
09.10.2011
Eiger 1,9k 2 9
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.
Matthias Hlawatsch 10.10.2011
Ja, relativ einfach:
fbd->Dispose();
Eiger 10.10.2011
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?
Eiger 10.10.2011
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.
Matthias Hlawatsch 10.10.2011
Ja, aber ich arbeite in dem Fall nicht in VS. Arbeite über Kommandozeile...
Eiger 10.10.2011
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.
Matthias Hlawatsch 10.10.2011
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...

Siehe dazu Compiler Error C2039 (letztes Beispiel) und das von dort verlinkte Destructors and Finalizers in Visual C++. Dort findet sich die Aussage

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.
10.10.2011
Matthias Hlawatsch 13,2k 4 9
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?
Eiger 10.10.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH