exception und dll
-
hallo leute
in dem beitrag http://www.c-plusplus.net/forum/viewtopic-var-t-is-265667-and-highlight-is-dll+exception.html wird behauptet das das werfen von exceptions als pointer ueber dll grenzen funktioniert. stimmt das nun ?
ich war immer der meinung das man keine exceptions werfen kann.hintergrund: ich habe 2 applikationen welche eine bestimmte dll, in VC geschrieben, benutzen. eine ist mit VC und die andere mit dem borland builder geschrieben. eleganter finde ich es, wenn ich in ausnahmesituationen eine exception werfen koennte.
Meep Meep
-
Zwischen VC APP und VC DLL funktioniert es, auch ohne Zeiger zu werfen (kannst ganz normal alles werfen was sonst auch geht).
Zwischen Borland und VC - keine Ahnung. Ausprobieren. Oder bei Borland nachfragen.Oder das Borland Programm auf VC portieren

-
hustbaer schrieb:
Oder das Borland Programm auf VC portieren

Oder das VC-Programm nach C++Builder portieren
Das scheint mir ohnehin sinnvoller, da die Primäranwendung ja in C++Builder geschrieben ist.
Warum wird die DLL denn mit VC übersetzt?Du kannst vermutlich schon Exceptions über Modulgrenzen hinweg werfen - C++Builder benutzt den SEH-Support von Windows für Exceptions, und VC vermutlich auch -, aber dann kommen sie auf der jeweils anderen Seite als "External Exception" an, was meistens nicht das ist, was du dir erhoffst.
Der saubere Weg, um Exceptions über diese Grenze zu befördern, wäre eine COM-Schnittstelle mit safecall-Funktionen. Vermutlich wird das von der ATL auch in irgendeiner Weise unterstützt und erleichtert, aber wirklich Spaß macht es in C++ nicht, weil du dauernd so etwas machen mußt:
HRESULT MyImpl::MyFunction (int arg, int* result) { try { /* actual implementation */ return S_OK; } catch (const std::exception& e) { return AtlReportError (classId, e.what (), __uuidof (IMyIntf), 0); } catch (...) { return AtlReportError (classId, "Unknown exception", __uuidof (IMyIntf), 0); } }Für ein oder zwei, von mir aus auch zwanzig oder fünfundzwanzig Funktionen ist das zur Not hinnehmbar. Aber darüberhinaus macht es wirklich keinen Spaß mehr. C++ ist da einfach die falsche Sprache; in Delphi oder C# etwa passiert das praktisch von selbst.
Edit: 'const' vergessen.
-
audacia schrieb:
Warum wird die DLL denn mit VC übersetzt?
weil ich einige klassen verwende die viel MS compilerabhaengigen code inne haben.
mal sehen, vielleicht finde ich noch eine andere brauchbare loesung.
Meep Meep
-
Meep Meep schrieb:
MS compilerabhaengigen code
Was heißt das genau? Benutzt du C++/CLI oder Managed C++? Oder irgendeine Bibliothek wie die ATL oder MFC? Oder irgendwelche MS-spezifischen Keywords?
Wenn du beispielsweise ohnehin schon C++/CLI benutzt, könntest du den COM-Export auch damit machen; in diesem Fall handhabt das .NET-Framework das ganze Exception-Wrapping für dich.
-
hi
keywords und intrinsics
Meep Meep