Проблема связывания C ++ и регистрации COM

Я добавил в свое приложение новую библиотеку (несколько проектов-DLL) - SQLite, чтобы выполнить кэширование в памяти. Это изменение затронуло только одну библиотеку / проект - Lib1.

Сборка проходит нормально. Все библиотеки построены успешно, ошибок не сообщается, включая пару объектов Com.

Если я попытаюсь зарегистрировать объекты com, я получу, что DLL не может быть загружена. Убедитесь, что все необходимые файлы времени выполнения приложения и другие зависимые библиотеки DLL доступны в каталоге DLL компонента или в системном пути. сообщение. Но все библиотеки в одном месте. И все на своем пути. Копия этого проекта строится и регистрируется нормально (конечно, без некоторых изменений, внесенных в SqlLite). Обходчик зависимостей не сообщает о проблемах

Как ни странно, если я пытаюсь зарегистрировать DLL объекта com (используя regsvr32), он работает нормально. Кроме того, у меня есть другая библиотека, которая зависит от Lib1 (а не от SqlLite), которая также не может быть загружена.

Любые идеи?

Спасибо, A'z


person aabramovich    schedule 01.07.2009    source источник
comment
Какая ОС у вас работает и какую программу вы используете для кодирования?   -  person Partial    schedule 01.07.2009
comment
Windows XP и среда (барабанная дробь) VS6.   -  person aabramovich    schedule 02.07.2009


Ответы (4)


Вы можете использовать Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) установлен для фильтрации имени процесса regsvr32.exe, чтобы видеть все обращения к файлам и реестру.

Всегда используйте полный путь к вашей-com-dll, когда вы вводите команды regsvr32, если у вас есть такая же dll где-то еще в пути (например, c: \ windows \ system32), regsvr32 будет использовать другую dll, а не ту, что находится в вашем текущем каталоге .

Еще одна уловка - использовать "rundll32 your-com-dll, DllRegisterServer". В случае отсутствия DLL он сообщит, какая DLL отсутствует, вместо того, чтобы просто сказать, что LoadLibrary не удалось.

Изменить: что вы имеете в виду, говоря «Если я попытаюсь зарегистрировать объекты com»? Как ты это делаешь? Я спрашиваю, потому что вы говорите, что regsvr32 в dll, который на самом деле реализует этот com-объект, работает нормально.

person Cristian Adam    schedule 01.07.2009
comment
Спасибо, завтра попробую мониторить процесс, выложу результаты! - person aabramovich; 02.07.2009
comment
Хорошо, запустил Process Monitor как для неудачной, так и для успешной конфигурации. нет разницы! Как я уже упоминал в первом посте, regsvr32 завершается без ошибок. - person aabramovich; 02.07.2009

Используйте инструмент обходчика зависимостей, чтобы выяснить, на какие другие DLL-файлы полагается COM-сервер. Затем проверьте пути к исполняемым файлам, которые заданы в Visual Studio (Инструменты -> Параметры -> Проекты -> Каталоги (я думаю)). Обратите внимание, что VS не использует системную переменную среды PATH - он использует то, что задано на странице параметров, поэтому, если путь к зависимостям не указан там, регистрация завершится неудачно, даже если вы использовали regsvr32 из командной строки, это было бы преуспевать.

person 1800 INFORMATION    schedule 01.07.2009
comment
в вопросе Нил упомянул, что обходчик зависимостей не сообщал об ошибках - person Uday; 01.07.2009
comment
Вопрос был не от Нила, и я не ожидал, что он сообщит о каких-либо проблемах. Вы можете использовать обходчик зависимостей, чтобы выяснить правильные пути к зависимостям. - person 1800 INFORMATION; 01.07.2009
comment
Спасибо, все библиотеки, которые я использую, в конце концов, находятся в одной папке. И эта папка первая в пути. Как я уже упоминал, у меня есть две копии одного и того же проекта. Один без изменений кода работает нормально. И больше всего раздражает то, что единственная библиотека, в которой действительно есть изменения, - загружается. Может быть, это поможет, но GetLastError возвращает 126. a'z - person aabramovich; 01.07.2009

Так вот, сюжет сгущается !!!!

Я на самом деле сузил диапазон до строки кода, которая вызывает эту проблему связывания. В модифицированной библиотеке (LIB1) я добавил новый класс A1, который наследуется от существующего класса A. Когда я изменяю существующий класс B, который раньше наследовал от A, теперь наследует от A1 - тогда возникает проблема. Класс B находится в lib3.

Я убедился, что когда я меняю наследование, возникает проблема !!!

Я использовал file-mon на regsvr32 при успешной загрузке и при сбое. Я изо всех сил пытаюсь найти разницу! Завтра утром попробую Process Monitor и посмотрю, поможет ли.

Все еще отчаянно нуждается в помощи, Аз

person aabramovich    schedule 01.07.2009

хм ... как спрашивает Кристиан, как еще вы пытаетесь зарегистрировать объекты, если regsvr32.exe завершается успешно?

Совет rundll32.exe тоже хорош. Вы пробовали пройти через DllRegisterServer в отладчике, чтобы точно увидеть, когда он терпит неудачу? это звучит как потенциальный сбой во время выполнения, если depends.exe ничего не раскрывает.

кстати, когда я ищу в Google этот точный текст ошибки, я вижу: http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/402c1767-cf1d-42f0-aec9-e0169dbf1083/, но я предполагаю, что вы Возможно, я уже выполнил этот поиск и нашел, что он бесполезен :)

person Community    schedule 07.07.2009
comment
Привет, я не могу ответить, почему regsvr32 работает, в то время как выполнение этого из окна регистрации ComObject - нет. Чем больше я отлаживал код M.S, тем меньше понимаю, что вызывает этот сбой. Прочтите ссылку внимательно, хотя это не помогло. Спасибо! - person aabramovich; 15.07.2009