«CoInitialize fail», когда одна функция (из библиотеки) включена в проект VC ++ MFC - PullRequest
0 голосов
/ 14 апреля 2009

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

Я включил две библиотеки libs и их .h в мою программу MFC Dialog и скомпилировал ее, нет проблем. Когда я вызываю функцию из одной из библиотек, она открывает диалоговое окно с надписью «Com Error» «CoInitialize Failed». Это не когда я на самом деле ВЫЗЫВАЮ функцию, это как только программа запускается. Я предполагаю, что когда он видит функцию, он на самом деле вызывает в lib, а когда он это делает, возможно, CoInit вызывается раньше, чем в моей программе MFC, что создает конфликт?

Проходя по коду, кажется, выкидывает это на CDialog :: DoModal

Я всегда могу добавить более подробную информацию, я просто надеялся, что меня направят в правильном направлении. Заранее большое спасибо за любую помощь!

EDIT:

Дело в том, что я не знаю, где DLL вызывает CoInitialize. Я действительно не могу опубликовать код, потому что там слишком много, даже для простой программы. Я попробую пройтись по зависимостям и проверить свой InitInstance ... Есть еще предложения? Большое спасибо, ребята

Ответы [ 5 ]

3 голосов
/ 14 апреля 2009

Попробуйте добавить свой собственный вызов CoInitializeEx и убедитесь, что вы используете потоки STA (SingleThreadedApartment) в основном потоке.

Скорее всего, что-то настраивает ваш основной поток как MTA, но ваша библиотека ожидает и требует STA, так что вызов CoInitialize не выполняется.

1 голос
/ 17 апреля 2009

Вы можете узнать, кто вызывает CoInitialize, поставив точку останова на то же самое.

Это то, как вы делаете это с помощью Средства отладки для Windows .

Сначала вы включаете запуск с параметром отладчика, используя gflags.exe для вашего exe.

Для этого

  1. run gflags.exe В опциях файла изображения укажите имя вашего exe, скажем, xyz.exe. Нажмите вкладку, чтобы включить параметры уровня изображения. В опции отладчика введите Полный путь к windbg -g

Это приведет к тому, что ваш exe-файл будет запущен с подключенным отладчиком при каждом запуске xyz.exe.

Теперь, чтобы установить точку останова при вызове CoInitialize, прервите выполнение в Windbg. В командной строке введите

bp Ole32! Коинициализировать

остановить отладку, сохранить рабочее пространство при появлении запроса и перезапустить xyz.exe

На этот раз приложение перейдет в отладчик, когда кто-нибудь вызовет CoInitialize.

Надеюсь, это поможет вам

1 голос
/ 14 апреля 2009

Вы должны вызывать CoInitialize в своем приложении InitInstance (). Затем он должен выполняться перед вызовом DoModal ().

Возможно, это сообщение об ошибке не указывает на то, что lib пыталась вызвать сам CoInitialize, а скорее пробовало какой-то другой COM-вызов, и из полученной там ошибки было установлено, что CoInitialize не был вызван вами.

1 голос
/ 14 апреля 2009

Хорошим направлением будет добавление дополнительных деталей, особенно если они у вас есть, например, какой HRESULT возвращает CoInitialize?

Я предполагаю, что такие библиотеки имеют статическую инициализацию, если ни одна из функций из dll не вызывается, они отбрасываются компоновщиком, но если хотя бы одна функция вызывается, тогда статические инициализаторы связываются.

0 голосов
/ 15 апреля 2009

Распространенной ошибкой является отсутствие ссылочной библиотеки DLL, поэтому при вызове CoInitialize она пытается загрузить библиотеку DLL и завершается неудачно со старым добрым E_FAIL. Попробуйте использовать средство обхода зависимостей и проверьте наличие библиотек DLL, которые вы, возможно, пропустили.

...