CreateInstance Возвращает «Указанный модуль не найден.» - PullRequest
1 голос
/ 30 июля 2011

Я пытался заставить программу, работающую на Windows 2000, работать на Windows 2003.Все, что я до сих пор делал, чтобы заставить программу работать на Windows 2003, было связано с неправильной конфигурацией.Прямо сейчас этот код:

chr = pAdapterEnvPtr.CreateInstance(__uuidof(PFADAPTERMNGLib::PFAdapterEnv));

возвращает:

0x8007007E

или другими словами:

The specified module could not be found.

У меня есть две другие программы и другая.dll и я могу успешно создавать экземпляры этих классов.Но это похоже на ошибку.

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

В OleView, если я пытаюсь создать экземпляр класса, я вижу следующее изображение:

Ошибка IClassFactory :: CreateInstance.Указанный модуль не может быть найден.серьезность: SEVERITY_ERROR, средство: FACILITY_WIN32 ($ 8007007E http://i52.tinypic.com/344bno0.png

Если вы посмотрите на левую сторону изображения, попытка создать экземпляр PFComgMng выдаст мне ту же ошибку. (PFAdapterEnv и PFCompMngиспользуйте тот же процесс, PFAdapterMng.exe.) Тем не менее, PFMQMonitor, PFSend и PFTrace все работают правильно (при использовании PFMQListen.exe, PFSend.dll и PFTraceService.exe.)

Еще одна вещь, которую я хотел отметить, это то, что следующий фрагмент кода:

hr = pPFCompMng.CreateInstance(__uuidof(PFADAPTERMNGLib::PFCompMng));

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

, поскольку Procmon не помогаетВ этом конкретном случае кто-нибудь знает, что я могу сделать, чтобы выяснить, что мешает другим процессам найти модуль?

ОБНОВЛЕНИЕ:

Я не могу запустить Dependency Walker с профилированием, потому что PFAdapterMng.exe и PFTraceService.exe должны быть запущены как сервисэс.Я попытался запустить Dependency Walker во время профилирования OleView и попытался создать экземпляры PFAdapterEnv и PFCompMng, чтобы выяснить, почему я получаю окно сообщения Module not found.К сожалению, Dependency Walker не показывал, что чего-то не хватает.

UPDATE2:

Возможно, я что-то пропустил в журнале Procmon, поэтому я создал новый журнал, захватывая события прямо перед этим.Я перешагнул через звонок на CreateInstance и сразу после звонка.Может быть, кто-то еще может взглянуть и сказать мне, если я пропустил это?Я просто не могу найти никаких признаков того, что PFMQListen.exe не может что-то найти ..

Вот ссылка на архивную папку с файлом Procmon, файлом .csv и файлом .xml.

http://www.mediafire.com/?07jq8zj7emmpsvd

UPDATE3:

Итак, мне удалось запустить Dependency Walker в режиме профиля, чтобы создать экземпляр PFAdapterEnv.Dependency Walker не нашел ни одного пропавшего .dll.

Итак, Procmon ничего не показывает, как и Dependency Walker.Я шагал по коду на уровне сборки с ollydbg, и я заметил, что ошибка была создана в функции NdrClientCall2.Я не знаю, означает ли это что-нибудь.

Есть идеи, что еще я могу попробовать?Нужно ли людям больше информации, чтобы помочь мне решить эту проблему?Если да, пожалуйста, спросите.

UPDATE4:

Я попытался использовать /RegServer для регистрации приложений, и это сработало.Я пытался использовать /RegServer ранее, где я просто отменил регистрацию, используя /UnregServer.На этот раз я также удалил компонент из Component Services, который мне нужен был, потому что я хотел запустить PFAdapterMng под другим именем.

Итак, похоже, что все работает при работе на /RegServer и двойном-при нажатии на приложения.Однако я бы хотел, чтобы все работало в другой конфигурации.

Как настроить все, чтобы приложения работали следующим образом:

PFAdapterMng.exe - зарегистрируйтесь как /Service и запуститепод другим именем через services.msc PFTraceServer.exe - Зарегистрируйтесь как /Service и запустите под другим именем через services.msc

PFMQListen.exe - Зарегистрируйтесь как /RegServer, который будет запущен PFAdapterMng PFMQSend.dll - Зарегистрировано в Regsvr32 и загружено PFAdapterMng

Спасибо, Krzys

1 Ответ

0 голосов
/ 30 июля 2011

Я предполагаю, что это связано с путем поиска некоторых зависимостей DLL исполняемого файла.Вы можете попробовать "Обозреватель зависимостей" на каждом модуле, чтобы увидеть, доступны ли все библиотеки DLL: http://www.dependencywalker.com/ И обновить PATH поиска, если необходимо.

...