Необработанное исключение, связанное с DLL

У меня проблема, когда я ссылаюсь на созданную мной DLL. Возникло исключение Unhandled exception at 0x000007FA17461069 (ntdll.dll). Странно то, что это происходит только в том случае, если я связываю DLL в приложении win32, но НЕ в консольном приложении win32. Проблема, похоже, связана с созданием потока.

Стек вызовов выглядит следующим образом:

msvcr110d.dll!_callthreadstartex() Line 354            C
msvcr110d.dll!_threadstartex(void * ptd) Line 337      C

Библиотека DLL содержит реализации для платформы ACE proactor, использующие порты завершения ввода-вывода операционных систем. Он отлично работает в консольном приложении, но не в оконном приложении Win32.

Любая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ: по запросу комментариев ниже:

Строка кода, вызывающая исключение, — ACE_Service_Config::open(GetCommandLineA());.

Я использую структуру конфигурации ACE, поэтому я динамически загружаю свою DLL с файлом svc.conf. Это единственная строка кода, которую необходимо записать в функцию main консольной программы.

Я попытался написать эту строку после того, как было перехвачено сообщение WM_CREATE. Он падает.


person l3utterfly    schedule 28.03.2013    source источник
comment
Что произойдет, если вы запустите его в режиме выпуска вместо отладки?   -  person Arun    schedule 28.03.2013
comment
Узнайте, где генерируется исключение. Убедитесь, что вы используете DLL и EXE, связанные с одними и теми же DLL, а не, например. один использует вариант отладки, но не другой. Проверьте журнал, чтобы узнать, какая именно DLL загружена. Узнайте, где точные различия между рабочей и нерабочей версиями. Найдите код, который вызывает исключение. Перегоните минимальный пример и опубликуйте его здесь.   -  person Ulrich Eckhardt    schedule 28.03.2013
comment
@ Арун: ммм... еще не пробовал. Я попробую. Однако, поскольку он работает в режиме выпуска, мне придется пересобрать все мои библиотеки, что займет некоторое время. Есть ли разница между режимом выпуска и режимом отладки?   -  person l3utterfly    schedule 28.03.2013
comment
@doomster: Все библиотеки собраны в режиме отладки с платформой x64   -  person l3utterfly    schedule 28.03.2013
comment
Когда вы говорите «ссылка на DLL», вы имеете в виду, что сбой происходит без вызова/запуска какого-либо кода из DLL?   -  person sashoalm    schedule 28.03.2013
comment
Нет. Я запустил функцию инициализации, которую написал в DLL.   -  person l3utterfly    schedule 28.03.2013


Ответы (1)


Когда вы создаете консольное приложение, ACE переопределяет main, чтобы убедиться, что оно правильно инициализировано. При создании приложения Windows win32 этот трюк не работает. Вы должны сами вызвать ACE::init() и ACE::fini(), см. ACE_wrappers/tests/ACE_Init_Test.cpp, где приведен пример того, как это можно сделать.

person Johnny Willemsen    schedule 29.03.2013
comment
Сделал трюк. Большое спасибо. Кстати, у меня есть еще один вопрос по ACE, вы, похоже, очень опытны в ACE, поэтому мне интересно, не могли бы вы помочь мне и с этим. - person l3utterfly; 29.03.2013
comment
Ссылка на вопрос: stackoverflow.com/questions/15705227/. Большое спасибо. - person l3utterfly; 29.03.2013
comment
Просто добавил комментарий, списки рассылки ACE действительно лучшее место, чтобы задать вопрос. - person Johnny Willemsen; 29.03.2013