Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

gus

Rozwiązany: [C++] Wyjątki w dll'ach

Polecane posty

Witam,

Mam taki problem. W bibliotece dynamicznej jest funkcja wyrzucająca wyjątek, który chciałbym przechwycić w programie korzystającym z tej biblioteki. Na potrzeby przedstawienia problemu zmajstrowałem prosty przykład.

Najpierw DLL'ka:

#include <exception>

__declspec(dllexport) void func()
{
throw std::exception();
}

I program główny:

#include <stdio.h>
#include <exception>

__declspec(dllimport) void func();

int main(int argc, char** argv)
{
try
{
fprintf(stderr, "Execution function throwing exception\n");
func();
fprintf(stderr, "Exception not handled \n");
}
catch (std::exception& e)
{
fprintf(stderr, "Exception handled \n");
}
return 0;
}

Kod kompiluję MinGW w wersji pod Linuksa. Efekt urochomienia programu pod windowsem jest następujący:

Execution function throwing exception
terminate called after throwing an instance of 'std::exception'
what(): std::exception

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Co muszę zrobić, żeby przechwycić ten wyjątek. Może jakieś opcje kompilatora?

Link do komentarza
Udostępnij na innych stronach

Najlepiej nie używać wyjątków w ogóle :)

Nigdy nie rzucałem wyjątkami z DLL'ki, więc nie wiem z czym dokładnie mogą być problemy.

Zajrzyj tutaj:

- http://www.gamedev.net/community/forums/to...topic_id=157446

- http://stackoverflow.com/questions/967982/...g-dll-exception

Generalnie są problemy z różnymi pulami pamięci i różnymi wersjami modułów. W skrócie rzucanie wyjątkami pomiędzy procesem i dllką to proszenie się o kłopoty.

Wiem też, że jeżeli DLLka alokuje pamięć, to ona powinna ją zwolnić.

Link do komentarza
Udostępnij na innych stronach

No cóż, z tym nieużywaniem wyjątków to nie jest prosta sprawa. Tworzę port aplikacji linuksowej na Windows, a sama aplikacja składa się z wielu bibliotek dynamicznych, które niestety rzucają wyjątkami. Jakaś drastyczna zmiana w architelturze aplikacji nie wchodzi w grę, więc zdaje się jestem zmuszony do poszukania innych rozwiązań. Na razie dorobiłem do biblioteki funkcję registerThrowFunction(), która zapisuje wskaźnik do funkcji z głównego programu. Nie jest to chyba zbyt ładne rozwiązanie :/ Może ktoś zna lepszy sposób?

Link do komentarza
Udostępnij na innych stronach

Generalnie wszyscy sugerują to samo, nie rzucać wyjątków z dlli. Jeśli nie da się tego uniknąć, to używać tego samego kompilatora z tą samą konfiguracją (chodzi przede wszystkim o runtime c++) dla dlli i exe.

Trzeba też pilnować zwalniania pamięci oraz momentu wyładowania biblioteki z procesu.

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...