Отображение информации о пути / версии для загруженного COM-объекта? - PullRequest
0 голосов
/ 07 октября 2008

У меня есть код, который использует менеджер категорий компонентов для загрузки всех классов, которые реализуют определенную категорию.

Есть ли простой способ получить описание, путь и информацию о версии из загруженной DLL или EXE?

Ответы [ 2 ]

1 голос
/ 07 октября 2008

Когда объект загружается in-proc (то есть из DLL) в той же квартире, возможно, есть некоторые хитрости, которые вы могли бы сделать, чтобы найти DLL в памяти. Например, если вы посмотрите в таблице виртуальных методов (vtable) указатели кода на живой объект, они обычно будут указывать на DLL. Затем вы могли бы использовать некоторые системные вызовы, чтобы определить, к какой загруженной DLL этот код принадлежит.

Но есть много потенциальных ловушек. Если вам нужно загрузить эти объекты в отдельную квартиру, тогда указатель кода будет указывать на заглушку, а не на сам код. Кроме того, многие COM-библиотеки фактически реализуют общие интерфейсы в классах-оболочках, предоставляемых средой выполнения, так что это, скорее всего, даст вам ложную информацию во многих распространенных случаях использования. (Т. Е. В конечном итоге вы получите информацию для библиотеки DLL времени выполнения, обычно MFC или ATL).

Когда объект загружается вне процесса (т.е. из EXE), я не знаю ни одного вероятного способа определить, какой EXE соответствует живому объекту. (Очевидно, что эти данные должны существовать где-то в вашем процессе или во время выполнения COM, но они находятся где-то ниже заглушек и, вероятно, зависят от версии Windows, которую вы используете).

Поэтому, если вы не смотрите на очень ограниченный набор объектов (все внутрипроцессные, которые загружаются в той же квартире, что и вы), вероятно, вам лучше всего использовать регистрационную информацию в реестре, чтобы найти то, что вам нужно. Это хлопотно, потому что это одна из тех вещей, которые могут меняться от версии к версии ОС, но, к счастью, COM существует достаточно долго, и это не меняло тонну на протяжении многих лет.

Учитывая CLSID объекта, который вы получили из Диспетчер категорий компонентов , вы должны найти соответствующий двоичный файл следующим образом:

  1. Открыть ключ реестра HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxx-yyyyy-zzzz-aaaa-bbbbbbbbbbbbbb} , где строка внутри фигурных скобок - это CLSID объекта, который вы хотите найти.
  2. Если это внутрипроцессный объект, там будет вложенный ключ с именем InProcServer32 , чей "default" REG_SZ содержит полный путь к необходимой вам DLL.
  3. Если это объект вне процесса, там будет вложенный ключ с именем LocalServer32 , чей "по умолчанию" REG_SZ содержит полный путь к необходимому EXE-файлу. В некоторых случаях вам может потребоваться обрезать командную строку, отключив эту строку, чтобы получить только путь к EXE.
  4. Используя DLL или EXE из предыдущих шагов, вы можете вызвать GetFileVersionInfo () в Win32 (или использовать System.Diagnostics.FileVersionInfo.GetVersionInfo , если у вас есть доступный .NET) получить структуру информации о версии из исполняемого файла, в которой будет указана версия и описание.
0 голосов
/ 15 октября 2008

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

Очевидно, что это работает только для объектов inproc, и не будет работать, если приложение очень динамично, но также будет перехватывать не-COM DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...