Когда объект загружается in-proc (то есть из DLL) в той же квартире, возможно, есть некоторые хитрости, которые вы могли бы сделать, чтобы найти DLL в памяти. Например, если вы посмотрите в таблице виртуальных методов (vtable) указатели кода на живой объект, они обычно будут указывать на DLL. Затем вы могли бы использовать некоторые системные вызовы, чтобы определить, к какой загруженной DLL этот код принадлежит.
Но есть много потенциальных ловушек. Если вам нужно загрузить эти объекты в отдельную квартиру, тогда указатель кода будет указывать на заглушку, а не на сам код. Кроме того, многие COM-библиотеки фактически реализуют общие интерфейсы в классах-оболочках, предоставляемых средой выполнения, так что это, скорее всего, даст вам ложную информацию во многих распространенных случаях использования. (Т. Е. В конечном итоге вы получите информацию для библиотеки DLL времени выполнения, обычно MFC или ATL).
Когда объект загружается вне процесса (т.е. из EXE), я не знаю ни одного вероятного способа определить, какой EXE соответствует живому объекту. (Очевидно, что эти данные должны существовать где-то в вашем процессе или во время выполнения COM, но они находятся где-то ниже заглушек и, вероятно, зависят от версии Windows, которую вы используете).
Поэтому, если вы не смотрите на очень ограниченный набор объектов (все внутрипроцессные, которые загружаются в той же квартире, что и вы), вероятно, вам лучше всего использовать регистрационную информацию в реестре, чтобы найти то, что вам нужно. Это хлопотно, потому что это одна из тех вещей, которые могут меняться от версии к версии ОС, но, к счастью, COM существует достаточно долго, и это не меняло тонну на протяжении многих лет.
Учитывая CLSID объекта, который вы получили из Диспетчер категорий компонентов , вы должны найти соответствующий двоичный файл следующим образом:
- Открыть ключ реестра
HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxx-yyyyy-zzzz-aaaa-bbbbbbbbbbbbbb
} , где строка внутри фигурных скобок - это CLSID объекта, который вы хотите найти.
- Если это внутрипроцессный объект, там будет вложенный ключ с именем InProcServer32 , чей "default"
REG_SZ
содержит полный путь к необходимой вам DLL.
- Если это объект вне процесса, там будет вложенный ключ с именем LocalServer32 , чей "по умолчанию"
REG_SZ
содержит полный путь к необходимому EXE-файлу. В некоторых случаях вам может потребоваться обрезать командную строку, отключив эту строку, чтобы получить только путь к EXE.
- Используя DLL или EXE из предыдущих шагов, вы можете вызвать GetFileVersionInfo () в Win32 (или использовать System.Diagnostics.FileVersionInfo.GetVersionInfo , если у вас есть доступный .NET) получить структуру информации о версии из исполняемого файла, в которой будет указана версия и описание.