2011-12-01 2 views
4

У меня есть DLL, которая бросает исключение, как так:Почему это исключение не попадает в DLL?

throw POMException(err, drvErr, errmsg); 

Вызывающий код находится в отдельной программе, и есть попытка, поймать блок, как так:

try 
{ 
    // function in separate DLL 
} 
catch (TXNPDO_Exception& e) 
{ 
    SR_PERFLOG_MSG(SR_PERFMASK_SELECT, "ERROR selectInStages"); 
    TXNDBO_THROW(e); 
} 

Где TXNPDO_Exception определен в включаемого файла:

#define TXNPDO_Exception POMException 

при запуске этого в отладчике, он утверждает, что POMException был необработанным. Я даже добавил пункт catch(...), и он все еще не обрабатывается.

Я подозреваю, что это связано с параметрами компиляции Visual C++, так как библиотека DLL, о которой идет речь, является старой библиотекой, которая скомпилирована отдельно от вызывающей ее программы. Я использую Visual Studio 2003.

Файлы cpp DLL скомпилированы со следующими (соответствующими) флагами: /X /GR /Ob1 /Zi /GX /Od /MDd /LD. Другие исключения в вызывающей программе обрабатываются правильно.

Может ли кто-нибудь объяснить причины, по которым это исключение не распространяется на вызывающую программу?

Edit:

библиотека DLL была ранее скомпилирован с возможным изменением среды сборки и кода, которые не доступны для меня. Ранее скомпилированная библиотека корректно передает исключения.

Я компиляция клиентской программы, используя тот же компилятор, используя в основном те же переключатели: -Od -W3 -Z7 -MDd -GX -GR -Zm800 (без /X или /Ob1 и /Z7 вместо /Zi).

+1

Элементы C++ не поддерживаются DLL. –

+0

Возможно, это зависит от того, что 'POMException' ... – AJG85

+1

Где находится/EH? Необходимые. –

ответ

1

Я наконец выяснил, в чем проблема, и в этом конкретном случае это не имеет никакого отношения к бросанию исключений между DLL.

Проблема возникает из-за того, что крюк обработчика исключений устанавливается дальше в стек вызовов. Я поставил диагноз, добавив try, catch (...) блоки к каждому уровню в библиотеке, пока не нашел точку, в которой исключение не было распространено. Когда я прокомментировал код регистрации крючка обработчика исключений, исключение было успешно распространено.

Теперь я должен выяснить работу крючков обработчика исключений, выходящих за рамки этого вопроса. Спасибо всем, кто поделился своими ответами.

2

Я бы предположил, что исключение исключений через границы .dll было возможно только тогда, когда различные DLL и исполняемые программы были скомпилированы против одной и той же среды выполнения на C++, таким образом, используя одну и ту же кучу. Я могу ошибаться, но это мое лучшее предположение.

Edit:

Я предполагаю, что я не был wrong.

+0

Я могу сказать, что клиент и DLL были скомпилированы одним и тем же компилятором. Что касается той же среды выполнения C++. Оба скомпилированы с использованием '/ MDd'. Разве это не означает библиотеку времени выполнения C++? – tvStatic

+0

@tvStatic: те же версии библиотеки? С теми же настройками? –

+0

@tvStatic В вашем вопросе вы говорите о отдельной компиляции, и это «используется» для работы. Это заставляет меня думать, что время выполнения отличается. Также/MDd не помогает. Может быть, какой-то патч был применен к компилятору, и клиент после него компилировался .dll? – FailedDev

Смежные вопросы