登録されたCOMコンポーネントを発見する -- com フィールド と registry フィールド と createobject フィールド と clsid フィールド 関連 問題

Discovering registered COM components












2
vote

問題

日本語

登録されたCOMコンポーネントが、レジストリで利用可能な情報を解析するだけで、登録されたCOMコンポーネントがスタンドアロンコンポーネントとして作成可能かどうかを判断する方法はありますか?特に、HKCR / CLSIDに記載されている情報によって?

私のシステムにはこのキーに12,000以上のエントリがあり、InProcServer32またはLocalServer32キーを持たない項目はすでに除外されていますが、これは項目の約半分を排除します。私はまだ創造的なオブジェクトではない、まださらに数千があると思います。できないものから作成できるものを区別するために、それらのうちの1つのうちの1つにcreateObject()を実行しようとする必要がありません。より効率的な方法はありますか?

英語

Is there a way to determine if a registered COM component is creatable as a stand-alone component simply by parsing the information available in the registry? In particular, by the information found in HKCR/ClsId?

My system has over 12,000 entries in this key, and I am already excluding any items that do not have an InProcServer32 or LocalServer32 key, but this only eliminates about half of the items. I believe there are still another couple thousand that are not creatable objects. I really don't want to have to attempt to do a CreateObject() on every one of them to distinguish the ones that can be created from the ones that cannot. Is there a more efficient way?

</div
           

回答リスト

4
 
vote
vote
ベストアンサー
 

OleView

私は OLEVIEW この目的のために(日に戻る:))

マニュアル/プログラム

正しく覚えていたら(近くにWindows PCなし):

  • クラスはTypeLibrary
  • にリンクする必要があります
  • typelibはバイナリ(DLL、OCX、EXE)を指します
  • このバイナリには物理的なタイプライブラリが含まれています。
    • MIDLコンパイラはそれを実行できます(スタブ/ Cヘッダーを生成)
    • OleViewはそれをすることができます(extract idl)
    • tlbimpはその
    • を実行できます
    • Win32 API
    • で実行できます。
    • 作成可能なオブジェクトは coclass interface ;; <コード> # linux: ./a.exe ~/.wine/drive_c/windows/system32/msxml6.dll C:GamesStacko>TestTypelib.exe c:WindowsSystem32msxml6.dll MSXML2: Microsoft XML, v6.0 Nof Type Infos: 149 IXMLDOMImplementation ---------------------------- Interface: Dispatch functions: 8 variables: 0 Function : QueryInterface returns : VT_VOID flags : invoke kind: function params : 2 params opt : 0 Parameter : riid type = VT_PTR (VT_USERDEFINED (GUID)) in Parameter : ppvObj type = VT_PTR (VT_PTR) out Function : AddRef returns : VT_UI4 flags : invoke kind: function params : 0 params opt : 0 ではありませんでした。私も作成可能なグローバルモジュールもありました。 'm coclasses
    • として定義されているかどうかわからない

コード

を見せる

タイプライブラリ内の情報をICTEPELIBとITYPEINFOインタフェースと読み込むことができます。 ICReateTypeLibとIcreateTypeInfoインターフェイスを使用して作成できます。ただし、Microsoft IDLコンパイラ(MIDL)は、おそらくICReateTypeとIcreatetypeinfoを使用する唯一のアプリケーションです。

クイックグーグルはこの便利なページを有効にしました: C ++を使ったタイプライブラリー

は、開始するコードをのを含みます。それが何も価値があるかどうかを見るためだけに、私はクラウドのWindowsインスタンスを解雇し、すべての情報源をつかみ、それをまとめた。

サイトに記載されているオプションとは対照的に、私は単に

で単にコンパイルされました <事前> <コード> cl.exe *.cpp /EHs ole32.lib oleaut32.lib

楽しみのために、MingWを使ってLinux(64ビット)のものをコンパイルしました:

<事前> <コード> i586-mingw32msvc-g++ *.cpp -loleaut32 -lole32 -o Typelib.exe

あなたに href="http://downloads.sehe.nl/stackoverflow/testtypelib.zip" refollow/testtypelib.zip"> zip-file を含む:

<事前> <コード> win32_Unicode.cpp - sources by René Nyffenegger win32_Unicode.h TestTypelib.cpp Typelib.cpp Typelib.h VariantHelper.cpp VariantHelper.h TestTypelib.exe - binary compiled on windows

テスト実行:

<事前> <コード> # linux: ./a.exe ~/.wine/drive_c/windows/system32/msxml6.dll C:GamesStacko>TestTypelib.exe c:WindowsSystem32msxml6.dll MSXML2: Microsoft XML, v6.0 Nof Type Infos: 149 IXMLDOMImplementation ---------------------------- Interface: Dispatch functions: 8 variables: 0 Function : QueryInterface returns : VT_VOID flags : invoke kind: function params : 2 params opt : 0 Parameter : riid type = VT_PTR (VT_USERDEFINED (GUID)) in Parameter : ppvObj type = VT_PTR (VT_PTR) out Function : AddRef returns : VT_UI4 flags : invoke kind: function params : 0 params opt : 0

(スニップ) および15499ライン以上

終了

私はこれがあなたのシステムをインストールするためのあなたのシステムをスキャンするのに良い出発点を与えることを願っています、作成可能な、comコンポーネント

 

Oleview

I used Oleview for this purpose (back in the day :))

Manual/programmatic

If I remember correctly (no Windows PC nearby):

  • the class should link to a typelibrary
  • the typelib will point to a binary (dll, ocx, exe)
  • this binary contains the physical typelibrary, which you should parse
    • the midl compiler can do that (generate stubs/C headers)
    • oleview can do that (extract IDL)
    • tlbimp can do that
    • you can do it with Win32 API
    • any creatable objects should be marked coclass (not interface or source; there were also global modules which I suppose are creatable too: I'm just not sure whether they are defined as coclasses

Show me the code

It is possible to read the information within a type library with the ITypeLib and ITypeInfo interfaces. They can be created with the ICreateTypeLib and ICreateTypeInfo interfaces. However, the Microsoft IDL compiler (MIDL) is probably the only application to ever use ICreateType and ICreateTypeInfo.

A quick google turned up this useful page: Reading Type Libraries with C++.

It contains just the code to get started. Just to see whether it was worth anything, I fired up a cloud Windows instance, grabbed all the sources and compiled it.

In contrast with the options mentioned on the site, I simply compiled on windows with

cl.exe *.cpp /EHs ole32.lib oleaut32.lib 

Just for fun, I compiled the stuff on Linux (64 bit) using MingW:

i586-mingw32msvc-g++ *.cpp -loleaut32 -lole32 -o Typelib.exe 

To save you the work I have put a zip-file up for download containing:

win32_Unicode.cpp     - sources by René Nyffenegger win32_Unicode.h TestTypelib.cpp Typelib.cpp Typelib.h VariantHelper.cpp VariantHelper.h TestTypelib.exe       - binary compiled on windows 

A test run:

# linux: ./a.exe ~/.wine/drive_c/windows/system32/msxml6.dll C:GamesStacko>TestTypelib.exe c:WindowsSystem32msxml6.dll  MSXML2: Microsoft XML, v6.0 Nof Type Infos: 149  IXMLDOMImplementation ----------------------------   Interface: Dispatch   functions: 8   variables: 0    Function     : QueryInterface     returns    : VT_VOID     flags      :      invoke kind: function     params     : 2     params opt : 0     Parameter  : riid type = VT_PTR (VT_USERDEFINED (GUID)) in     Parameter  : ppvObj type = VT_PTR (VT_PTR) out    Function     : AddRef     returns    : VT_UI4     flags      :      invoke kind: function     params     : 0     params opt : 0 

(snip) and 15499 lines more

Concluding

I hope this gives you a good starting point in scanning your system for installed, creatable, COM components

</div
 
 
     
     
1
 
vote

は、「Creaintable」との意味を依存します。 <コード> LocalServer32 または<コード> InprocServer32 キーがある場合は、ローカルに作成可能である必要があります。 AppID を持っていて、appidのいずれかが LocalService キーキーを持っている場合は、リモートで創造可能かもしれません。

しかし、レジストリをコンサルティングすると、質問にのみ答えます。

まだ作成できないかもしれません:

  • アンインストールされていないコンポーネントからの登録、または "Fossil"レジストリエントリが壊れている可能性があります。
  • コンポーネントは、意図的に文書化されていないため、使用方法がわからない場合は、ある種の内部Windowsコンポーネントである可能性があります。
  • コンポーネントは、追加の要件が記載されていないインストールされているアプリケーションの内部コンポーネントです。
  • あなたは許可がないかもしれません。

作成可能な他のコンポーネントがあるかもしれません:

  • WSCスクリプトレットなどの登録のないCOMコンポーネントがある場合があります。
  • 登録無料のCOM DLLがあるかもしれません。あなたがCOMコンポーネントであるために登録しなければならないという法律はありません。登録はほとんどの人がオプトしているオプションのサービスです。

だから私は答えを推測していると思いますが、レジストリを使ってほとんどの完全なリストを入手できるはずですが、リストは何ですか?

あなたがリストを望むものを知らずに、リストが十分に良いかどうかを知ることは不可能です。

 

Depends what you mean by "createable". If it has a LocalServer32 or InprocServer32 key it should be locally creatable. It may also be creatable remotely if it has an AppID and the AppID has either LocalService or RemoteServer keys.

However consulting the registry will only answer the question "does it look like it ought to be creatable".

You might still not be able to create it:

  • The registration might be broken, or "fossil" registry entries from uninstalled components.
  • The component might be an internal Windows component of some sort that you have no idea how to use since it is intentionally not documented.
  • The component might be an internal component of an installed application which has additional requirements not documented.
  • You might not have permission.

There may be other components you could create:

  • There might be registration-free COM components, such as WSC scriptlets.
  • there might be registration-free COM DLLs. There is no law saying you have to be registered to be a COM component. Registration is an optional service that most people opt into.

So I guess the answer is you should be able to get a mostly complete list using the registry, but what is the list for?

Without knowing what you want the list for, it is impossible to know if the list is good enough.

</div
 
 
     
     

関連する質問

1  COM:良いCLSIDを取得します  ( Com retrieve good clsid ) 
CLSIDにはほとんど問題がありません。 パラメータA refclsidを持つ(フック)関数を持っています。 だから私はこのパラメータを印刷したいです。 私はしました: <事前> <コード> LPOLESTR pOleStr; StringFromCLSID...

0  80070005のCOMクラスファクトリの取得に失敗しましたASP.NET MVCアプリケーションで拒否されました  ( Retrieving the com class factory for component failed due to 80070005 access is ) 
ねえ、私がコンドオフィスのExcelを取得するという問題を経験しています。 これは私のコードです: <事前> <コード> public async Task<bool> updateExcelSheets(string excelName, DateTime ...

0  エラー80070005 - DCOMでMicrosoft ExcelアプリケーションまたはCLSID {00024500-0000-0000-C000-0000000046}が見つかりません。  ( Error 80070005 i cant find microsoft excel application or clsid 00024500 000 ) 
この post 、私は流れを変えました。 私はユーザーにExcelをアップロードするように頼みましたので、後で操作できるようにします。 それから私はエラーを得ました: clsidを使用してコンポーネントforコンポーネントを取得する{00024500-00...

11  DLLファイルのCLSIDを取得しますか?  ( Getting clsid for a dll file ) 
レジストリからユーザー定義のコンテキストメニューエントリを追加および削除するための小さなアプリを作成したいです。これをするために、どういうわけか新しいDLLのCLSIDを取得する必要があるので、新しいものを書く前に存在する場合は以前のエントリをバックアップでき...

29  CLSIDを与えられたDLLを見つける方法は?  ( How to find a dll given a clsid ) 
管理されていないDLLが管理されていないDLLを呼び出す状況があります。私は管理されていないDLLのCLSIDを知っています、私はそのCLSIDを持っているバイナリファイルを収録する方法はありませんか? ...

1  CLSIDのみが異なる場合は、2つのCOMコンポーネントへの.NETプロジェクト参照を作成しますか?  ( Create net project references to two com components when only the clsids differ ) 
簡潔: CLSIDを除いて同一の2つのUMmanaged COMコンポーネントに2つのummanaged COMコンポーネントに2つの参照を作成する方法はありますか?それらは同じPROGID、および同じタイプのlibを持っています。 タイプlibは、2番目...

0  Windowsレジストリの既知のCLSIDのリストはありますか?  ( Is there a list for known clsids of the windows registry ) 
Windowsレジストリの {16d51579-a30b-4c8b-a276-0ff4dc41e755} など、 {16d51579-a30b-4c8b-a276-0ff4dc41e755} の多くのCLSID値( HKEY_CLASSES_ROOTCLSI...

1  WIXを使用してWindowsレジストリに新しいCLSIDを追加します  ( Add a new clsid to windows registry using wix ) 
Windowsデスクトップ検索で新しいフィルタを登録しようとしています。これを達成するのに最適な方法では、既存の永続的なハンドラCLSIDを使用して新しいフィルタを登録します。しかし、これは.html persistenthandler clsid、 998...

2  登録されたCOMコンポーネントを発見する  ( Discovering registered com components ) 
登録されたCOMコンポーネントが、レジストリで利用可能な情報を解析するだけで、登録されたCOMコンポーネントがスタンドアロンコンポーネントとして作成可能かどうかを判断する方法はありますか?特に、HKCR / CLSIDに記載されている情報によって? 私のシス...

3  GUID値のテンプレートを専門としています  ( Specialize a template for a guid value ) 
これは、フィールドではない一定のポッドオブジェクトの定数自体から? ライブラリからのヘッダーのようなクラスGUIDを宣言します <事前> <コード> static const GUID CLSID_EH264VD = { 0x96b9d0ed, 0x8d1...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有