例えばカレンダーを実現するXXXX.ocxファイルが、実際になんと言う名称なのか、その実現機能とファイル名との対応関係が一覧になっている情報はないでしょうか。
対応を表にしたいのですが、これは手作業しか無理なのでしょうか。
ActiveX(COM) の情報は、基本的には「レジストリ」+「タイプライブラリ」(OLEView.exe で表示できる内容)から取得できます。
これらの情報を取得するコンポーネントがありますので、それらを使用して一覧を作成することが可能です。
参考までにコンポーネントの一覧を取得するスクリプト(VBScript を使用)を作成してみました。
<スクリプトの概要> 1. レジストリ HKCR\CLSID\ 配下のレジストリを列挙 2. レジストリ HKCR\CLSID\{XXXXXXXX}\Control のものを ActiveX と判断する 3. コンポーネント情報(ProgID, HelpString 等)を取得 4. 結果をレコードセットに詰める 5. 1~4 を繰り返す 6. 結果をタブ区切り形式で表示
以下のスクリプトをコマンドラインで
CScript ExportOcxList.vbs //Nologo > out.txt
として、実行すると、結果をタブ区切りのファイルとして出力します。
' File Name : ExportOcxList.vbs ' Usage : CScript ExportOcxList.vbs //Nologo > out.txt Option Explicit ' Registry Const HKEY_CLASSES_ROOT = &H80000000 ' ADO Const adVarChar = 200 Const adFldIsNullable = 32 Call Main() ' メイン Sub Main() ' 初期処理 Dim strComputer strComputer = "." ' ■ レジストリ / サブキーの列挙 ' http://www.microsoft.com/japan/technet/scriptcenter/scripts/os/registry/osrgvb10.mspx Dim oReg Set oReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") ' ■ FILE: Tlbinf32.exe : Help Files for Tlbinf32.dll ' http://support.microsoft.com/kb/224331/en-us Dim tliApp Set tliApp = CreateObject("TLI.TLIApplication") ' データ格納用レコードセットの用意 Dim rs Set rs = MakeRecordset() ' データ収集開始 Dim strKeyPath strKeyPath = "CLSID" Dim arrSubKeys oReg.EnumKey HKEY_CLASSES_ROOT, strKeyPath, arrSubKeys Dim subKey Dim strFindKey For Each subkey In arrSubKeys If Left(subKey,1) = "{" And Right(subKey,1) = "}" Then strFindKey = strKeyPath & "\" & subkey If IsActiveX( oReg, strFindKey ) Then Call GetComInfo( tliApp, oReg, strFindKey, rs ) End If End If Next ' データ表示 Dim strDelimiter strDelimiter = vbTab ' 区切り文字を指定(vbTab : タブ文字) ShowRecordset rs, strDelimiter ' メモリ開放 Set rs = Nothing Set tliApp = Nothing Set oReg = Nothing End Sub ' ActiveX かどうかの判別 Function IsActiveX( oReg, strKeyPath ) Dim bResult bResult = False Dim subkey Dim arrSubKeys oReg.EnumKey HKEY_CLASSES_ROOT, strKeyPath, arrSubKeys If IsNull( arrSubKeys ) Then IsActiveX = bResult Exit Function End If ' "HKCR\CLSID\{XXXXXXXX}\Control" がある COM を ActiveX と判断する For Each subkey In arrSubKeys If LCase( subkey ) = "control" Then bResult = True Exit For End If Next IsActiveX = bResult End Function ' データ格納用レコードセットの準備 Function MakeRecordset() Dim rs Set rs = CreateObject("ADODB.Recordset") rs.Fields.Append "CLSID", adVarChar, 255, adFldIsNullable rs.Fields.Append "ProgID", adVarChar, 255, adFldIsNullable rs.Fields.Append "InprocServer32", adVarChar, 255, adFldIsNullable rs.Fields.Append "LocalServer32", adVarChar, 255, adFldIsNullable rs.Fields.Append "Description", adVarChar, 255, adFldIsNullable rs.Fields.Append "HelpString", adVarChar, 255, adFldIsNullable rs.Open Set MakeRecordset = rs End Function ' データ表示 Sub ShowRecordset( rs, strDelimiter ) On Error Resume Next rs.MoveFirst ' タイトル行 Dim strLine strLine = GetFieldNameList( rs, strDelimiter ) WScript.Echo strLine ' タイトル行を出力 ' データ行 While Not rs.BOF And Not rs.EOF strLine = GetFieldValueList( rs, strDelimiter ) WScript.Echo strLine ' データ行を出力 rs.MoveNext Wend End Sub ' カラム名の一覧(1行分)を取得 Function GetFieldNameList( rs, strDelimiter ) Dim strResult Dim bFirst bFirst = True Dim fld For Each fld In rs.Fields If bFirst Then strResult = Chr(34) & fld.Name & Chr(34) bFirst = False Else strResult = strResult & strDelimiter & Chr(34) & fld.Name & Chr(34) End If Next GetFieldNameList = strResult End Function ' カラムデータの一覧(1行分)を取得 Function GetFieldValueList( rs, strDelimiter ) Dim strResult Dim bFirst bFirst = True Dim fld For Each fld In rs.Fields If bFirst Then strResult = Chr(34) & fld.Value & Chr(34) bFirst = False Else strResult = strResult & strDelimiter & Chr(34) & fld.Value & Chr(34) End If Next GetFieldValueList = strResult End Function ' COM 情報を取得 Function GetComInfo( tliApp, oReg, strKeyPath, ByRef rs ) Dim strCLSID Dim strProgID Dim strInprocServer32 Dim strLocalServer32 Dim strDescription Dim strHelpString Dim strFilePath strCLSID = Mid( strKeyPath, InStrRev( strKeyPath, "\" ) + 1 ) strProgID = GetKeyValue( oReg, strKeyPath & "\ProgID", "" ) strInprocServer32 = GetKeyValue( oReg, strKeyPath & "\InprocServer32", "" ) strLocalServer32 = GetKeyValue( oReg, strKeyPath & "\LocalServer32", "" ) strDescription = GetKeyValue( oReg, strKeyPath, "" ) strFilePath = SelectFilePath( strInprocServer32, strLocalServer32 ) strHelpString = GetHelpString( tliApp, strFilePath ) rs.AddNew() rs.Fields( "CLSID" ) = strCLSID rs.Fields( "ProgID" ) = strProgID rs.Fields( "InprocServer32" ) = strInprocServer32 rs.Fields( "LocalServer32" ) = strLocalServer32 rs.Fields( "Description" ) = strDescription rs.Fields( "HelpString" ) = strHelpString rs.Update() End Function ' レジストリ値を取得 Function GetKeyValue( oReg, strKeyPath, strValueName ) Dim strResult Dim strValue Call oReg.GetStringValue( HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue ) strResult = strValue GetKeyValue = strResult End Function ' パス名がセットされている方を選択 Function SelectFilePath( strFileName1, strFileName2 ) Dim strResult If Len( strFileName1) > 0 Then strResult = strFileName1 Else strResult = strFileName2 End If SelectFilePath = strResult End Function ' 指定コンポーネントのヘルプ情報を取得 Function GetHelpString( tliApp, strFullPath ) Dim strResult On Error Resume Next ' TypeLibInformation ActiveX オブジェクト (tlbinf32.dll) を使用してヘルプ情報を取得 Dim tli Set tli = tliApp.TypeLibInfoFromFile( strFullPath ) If Err.Number > 0 Then strResult = "" Else strResult = tli.HelpString End If Set tli = Nothing GetHelpString = strResult End Function
CLSID | ProgID | InprocServer32 | LocalServer32 | Description | HelpString |
---|---|---|---|---|---|
{612A8624-0FB3-11CE-8747-524153480004} | COMCTL.Toolbar.1 | C:\WINDOWS\system32\comctl32.ocx | Microsoft Toolbar Control, version 5.0 (SP2) | Microsoft Windows Common Controls 5.0 (SP2) | |
{66833FE6-8583-11D1-B16A-00C0F0283628} | MSComctlLib.Toolbar.2 | C:\WINDOWS\system32\mscomctl.ocx | Microsoft Toolbar Control, version 6.0 | Microsoft Windows Common Controls 6.0 (SP6) | |
{0713E8A2-850A-101B-AFC0-4210102A8DA7} | COMCTL.TreeCtrl.1 | C:\WINDOWS\system32\comctl32.ocx | Microsoft TreeView Control, version 5.0 (SP2) | Microsoft Windows Common Controls 5.0 (SP2) | |
{C74190B6-8589-11D1-B16A-00C0F0283628} | MSComctlLib.TreeCtrl.2 | C:\WINDOWS\system32\mscomctl.ocx | Microsoft TreeView Control, version 6.0 | Microsoft Windows Common Controls 6.0 (SP6) | |
{603C7E80-87C2-11D1-8BE3-0000F8754DA1} | MSComCtl2.UpDown.2 | C:\WINDOWS\system32\MSCOMCT2.OCX | Microsoft UpDown Control 6.0 (SP6) | Microsoft Windows Common Controls-2 6.0 (SP6) | |
{026371C0-1B7C-11CF-9D53-00AA003C9CB6} | ComCtl2.UpDown.1 | C:\WINDOWS\system32\COMCT232.OCX | Microsoft UpDown Control, version 5.0 (SP2) | Microsoft Windows Common Controls-2 5.0 (SP2) | |
{8856F961-340A-11D0-A96B-00C04FD705A2} | Shell.Explorer.2 | C:\WINDOWS\system32\ieframe.dll | Microsoft Web Browser | Microsoft Internet Controls | |
{248DD896-BB45-11CF-9ABC-0080C7E7B78D} | MSWinsock.Winsock.1 | C:\WINDOWS\system32\MSWINSCK.OCX | Microsoft WinSock Control, version 6.0 (SP6) | Microsoft Winsock Control 6.0 (SP6) | |
{00E1DB59-6EFD-4CE7-8C0A-2DA3BCAAD9C6} | MicrosoftWorks.WkImgSrv.WksImagingServer.6 | C:\Program Files\Microsoft Works\wkimgsrv.dll | Microsoft Works Imaging Server | WkImgSrv 1.0 Type Library | |
{8E27C92B-1264-101C-8A2F-040224009C02} | MSCAL.Calendar.7 | C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX | Microsoft カレンダー コントロール 11.0 | Microsoft Calendar Control 11.0 | |
{D9347033-9612-11D1-9D75-00C04FCC8CDC} | BARCODE.BarCodeCtrl.1 | C:\Program Files\Microsoft Office\OFFICE11\1041\MSBCODE9.OCX | Microsoft バーコード コントロール 9.0 | Microsoft Access BarCode Control 9.0 | |
{67331D85-BE17-42f6-8D3F-47B8E8B26637} | MigrationWizard.OOBE.1 | C:\WINDOWS\system32\SHELL32.dll | Migration Wizard OOBE Automation Object | Microsoft Shell Controls And Automation |
■ [VB] Visual Basic 6.0 に添付されている ActiveX コントロール一覧 http://support.microsoft.com/kb/412577/ja ■ [VB] ActiveX コンポーネントで作成されるレジストリ エントリ http://support.microsoft.com/kb/183771/ja ■ レジストリ / サブキーの列挙 http://www.microsoft.com/japan/technet/scriptcenter/scripts/os/r... ■ FILE: Tlbinf32.exe : Help Files for Tlbinf32.dll http://support.microsoft.com/kb/224331/en-us ■ ADO API リファレンス http://msdn.microsoft.com/library/ja/jpado260/htm/mdmscadoapiref...
Visual Studio 2008 Professional Edition しか手元にないので他のバージョンでは確認できませんでしたが、C# か VB プロジェクトを作成し、フォームデザイナを開いている状態で「ツールボックス」を右クリック(ツールボックスが開いていない場合は「表示(V)」→「ツールボックス(X)」でツールボックスを開けます)→「アイテムの選択(I)...」→「COM コンポーネント」タブで一覧を表示することができます。
おそらく、無料で配布されている Visual C# (Basic) 2008 Express Edition にも同様の機能があると思われます。
参考1:http://msdn2.microsoft.com/ja-jp/library/cby6tzh5(VS.80).aspx
ありがとうございます。
VB6で確認しました。
対応を表にしたいのですが、これは手作業しか無理なのでしょうか。
実はそれが一番欲しいのです。
対応を表にしたいのですが、これは手作業しか無理なのでしょうか。
ActiveX(COM) の情報は、基本的には「レジストリ」+「タイプライブラリ」(OLEView.exe で表示できる内容)から取得できます。
これらの情報を取得するコンポーネントがありますので、それらを使用して一覧を作成することが可能です。
参考までにコンポーネントの一覧を取得するスクリプト(VBScript を使用)を作成してみました。
<スクリプトの概要> 1. レジストリ HKCR\CLSID\ 配下のレジストリを列挙 2. レジストリ HKCR\CLSID\{XXXXXXXX}\Control のものを ActiveX と判断する 3. コンポーネント情報(ProgID, HelpString 等)を取得 4. 結果をレコードセットに詰める 5. 1~4 を繰り返す 6. 結果をタブ区切り形式で表示
以下のスクリプトをコマンドラインで
CScript ExportOcxList.vbs //Nologo > out.txt
として、実行すると、結果をタブ区切りのファイルとして出力します。
' File Name : ExportOcxList.vbs ' Usage : CScript ExportOcxList.vbs //Nologo > out.txt Option Explicit ' Registry Const HKEY_CLASSES_ROOT = &H80000000 ' ADO Const adVarChar = 200 Const adFldIsNullable = 32 Call Main() ' メイン Sub Main() ' 初期処理 Dim strComputer strComputer = "." ' ■ レジストリ / サブキーの列挙 ' http://www.microsoft.com/japan/technet/scriptcenter/scripts/os/registry/osrgvb10.mspx Dim oReg Set oReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") ' ■ FILE: Tlbinf32.exe : Help Files for Tlbinf32.dll ' http://support.microsoft.com/kb/224331/en-us Dim tliApp Set tliApp = CreateObject("TLI.TLIApplication") ' データ格納用レコードセットの用意 Dim rs Set rs = MakeRecordset() ' データ収集開始 Dim strKeyPath strKeyPath = "CLSID" Dim arrSubKeys oReg.EnumKey HKEY_CLASSES_ROOT, strKeyPath, arrSubKeys Dim subKey Dim strFindKey For Each subkey In arrSubKeys If Left(subKey,1) = "{" And Right(subKey,1) = "}" Then strFindKey = strKeyPath & "\" & subkey If IsActiveX( oReg, strFindKey ) Then Call GetComInfo( tliApp, oReg, strFindKey, rs ) End If End If Next ' データ表示 Dim strDelimiter strDelimiter = vbTab ' 区切り文字を指定(vbTab : タブ文字) ShowRecordset rs, strDelimiter ' メモリ開放 Set rs = Nothing Set tliApp = Nothing Set oReg = Nothing End Sub ' ActiveX かどうかの判別 Function IsActiveX( oReg, strKeyPath ) Dim bResult bResult = False Dim subkey Dim arrSubKeys oReg.EnumKey HKEY_CLASSES_ROOT, strKeyPath, arrSubKeys If IsNull( arrSubKeys ) Then IsActiveX = bResult Exit Function End If ' "HKCR\CLSID\{XXXXXXXX}\Control" がある COM を ActiveX と判断する For Each subkey In arrSubKeys If LCase( subkey ) = "control" Then bResult = True Exit For End If Next IsActiveX = bResult End Function ' データ格納用レコードセットの準備 Function MakeRecordset() Dim rs Set rs = CreateObject("ADODB.Recordset") rs.Fields.Append "CLSID", adVarChar, 255, adFldIsNullable rs.Fields.Append "ProgID", adVarChar, 255, adFldIsNullable rs.Fields.Append "InprocServer32", adVarChar, 255, adFldIsNullable rs.Fields.Append "LocalServer32", adVarChar, 255, adFldIsNullable rs.Fields.Append "Description", adVarChar, 255, adFldIsNullable rs.Fields.Append "HelpString", adVarChar, 255, adFldIsNullable rs.Open Set MakeRecordset = rs End Function ' データ表示 Sub ShowRecordset( rs, strDelimiter ) On Error Resume Next rs.MoveFirst ' タイトル行 Dim strLine strLine = GetFieldNameList( rs, strDelimiter ) WScript.Echo strLine ' タイトル行を出力 ' データ行 While Not rs.BOF And Not rs.EOF strLine = GetFieldValueList( rs, strDelimiter ) WScript.Echo strLine ' データ行を出力 rs.MoveNext Wend End Sub ' カラム名の一覧(1行分)を取得 Function GetFieldNameList( rs, strDelimiter ) Dim strResult Dim bFirst bFirst = True Dim fld For Each fld In rs.Fields If bFirst Then strResult = Chr(34) & fld.Name & Chr(34) bFirst = False Else strResult = strResult & strDelimiter & Chr(34) & fld.Name & Chr(34) End If Next GetFieldNameList = strResult End Function ' カラムデータの一覧(1行分)を取得 Function GetFieldValueList( rs, strDelimiter ) Dim strResult Dim bFirst bFirst = True Dim fld For Each fld In rs.Fields If bFirst Then strResult = Chr(34) & fld.Value & Chr(34) bFirst = False Else strResult = strResult & strDelimiter & Chr(34) & fld.Value & Chr(34) End If Next GetFieldValueList = strResult End Function ' COM 情報を取得 Function GetComInfo( tliApp, oReg, strKeyPath, ByRef rs ) Dim strCLSID Dim strProgID Dim strInprocServer32 Dim strLocalServer32 Dim strDescription Dim strHelpString Dim strFilePath strCLSID = Mid( strKeyPath, InStrRev( strKeyPath, "\" ) + 1 ) strProgID = GetKeyValue( oReg, strKeyPath & "\ProgID", "" ) strInprocServer32 = GetKeyValue( oReg, strKeyPath & "\InprocServer32", "" ) strLocalServer32 = GetKeyValue( oReg, strKeyPath & "\LocalServer32", "" ) strDescription = GetKeyValue( oReg, strKeyPath, "" ) strFilePath = SelectFilePath( strInprocServer32, strLocalServer32 ) strHelpString = GetHelpString( tliApp, strFilePath ) rs.AddNew() rs.Fields( "CLSID" ) = strCLSID rs.Fields( "ProgID" ) = strProgID rs.Fields( "InprocServer32" ) = strInprocServer32 rs.Fields( "LocalServer32" ) = strLocalServer32 rs.Fields( "Description" ) = strDescription rs.Fields( "HelpString" ) = strHelpString rs.Update() End Function ' レジストリ値を取得 Function GetKeyValue( oReg, strKeyPath, strValueName ) Dim strResult Dim strValue Call oReg.GetStringValue( HKEY_CLASSES_ROOT, strKeyPath, strValueName, strValue ) strResult = strValue GetKeyValue = strResult End Function ' パス名がセットされている方を選択 Function SelectFilePath( strFileName1, strFileName2 ) Dim strResult If Len( strFileName1) > 0 Then strResult = strFileName1 Else strResult = strFileName2 End If SelectFilePath = strResult End Function ' 指定コンポーネントのヘルプ情報を取得 Function GetHelpString( tliApp, strFullPath ) Dim strResult On Error Resume Next ' TypeLibInformation ActiveX オブジェクト (tlbinf32.dll) を使用してヘルプ情報を取得 Dim tli Set tli = tliApp.TypeLibInfoFromFile( strFullPath ) If Err.Number > 0 Then strResult = "" Else strResult = tli.HelpString End If Set tli = Nothing GetHelpString = strResult End Function
CLSID | ProgID | InprocServer32 | LocalServer32 | Description | HelpString |
---|---|---|---|---|---|
{612A8624-0FB3-11CE-8747-524153480004} | COMCTL.Toolbar.1 | C:\WINDOWS\system32\comctl32.ocx | Microsoft Toolbar Control, version 5.0 (SP2) | Microsoft Windows Common Controls 5.0 (SP2) | |
{66833FE6-8583-11D1-B16A-00C0F0283628} | MSComctlLib.Toolbar.2 | C:\WINDOWS\system32\mscomctl.ocx | Microsoft Toolbar Control, version 6.0 | Microsoft Windows Common Controls 6.0 (SP6) | |
{0713E8A2-850A-101B-AFC0-4210102A8DA7} | COMCTL.TreeCtrl.1 | C:\WINDOWS\system32\comctl32.ocx | Microsoft TreeView Control, version 5.0 (SP2) | Microsoft Windows Common Controls 5.0 (SP2) | |
{C74190B6-8589-11D1-B16A-00C0F0283628} | MSComctlLib.TreeCtrl.2 | C:\WINDOWS\system32\mscomctl.ocx | Microsoft TreeView Control, version 6.0 | Microsoft Windows Common Controls 6.0 (SP6) | |
{603C7E80-87C2-11D1-8BE3-0000F8754DA1} | MSComCtl2.UpDown.2 | C:\WINDOWS\system32\MSCOMCT2.OCX | Microsoft UpDown Control 6.0 (SP6) | Microsoft Windows Common Controls-2 6.0 (SP6) | |
{026371C0-1B7C-11CF-9D53-00AA003C9CB6} | ComCtl2.UpDown.1 | C:\WINDOWS\system32\COMCT232.OCX | Microsoft UpDown Control, version 5.0 (SP2) | Microsoft Windows Common Controls-2 5.0 (SP2) | |
{8856F961-340A-11D0-A96B-00C04FD705A2} | Shell.Explorer.2 | C:\WINDOWS\system32\ieframe.dll | Microsoft Web Browser | Microsoft Internet Controls | |
{248DD896-BB45-11CF-9ABC-0080C7E7B78D} | MSWinsock.Winsock.1 | C:\WINDOWS\system32\MSWINSCK.OCX | Microsoft WinSock Control, version 6.0 (SP6) | Microsoft Winsock Control 6.0 (SP6) | |
{00E1DB59-6EFD-4CE7-8C0A-2DA3BCAAD9C6} | MicrosoftWorks.WkImgSrv.WksImagingServer.6 | C:\Program Files\Microsoft Works\wkimgsrv.dll | Microsoft Works Imaging Server | WkImgSrv 1.0 Type Library | |
{8E27C92B-1264-101C-8A2F-040224009C02} | MSCAL.Calendar.7 | C:\Program Files\Microsoft Office\OFFICE11\MSCAL.OCX | Microsoft カレンダー コントロール 11.0 | Microsoft Calendar Control 11.0 | |
{D9347033-9612-11D1-9D75-00C04FCC8CDC} | BARCODE.BarCodeCtrl.1 | C:\Program Files\Microsoft Office\OFFICE11\1041\MSBCODE9.OCX | Microsoft バーコード コントロール 9.0 | Microsoft Access BarCode Control 9.0 | |
{67331D85-BE17-42f6-8D3F-47B8E8B26637} | MigrationWizard.OOBE.1 | C:\WINDOWS\system32\SHELL32.dll | Migration Wizard OOBE Automation Object | Microsoft Shell Controls And Automation |
■ [VB] Visual Basic 6.0 に添付されている ActiveX コントロール一覧 http://support.microsoft.com/kb/412577/ja ■ [VB] ActiveX コンポーネントで作成されるレジストリ エントリ http://support.microsoft.com/kb/183771/ja ■ レジストリ / サブキーの列挙 http://www.microsoft.com/japan/technet/scriptcenter/scripts/os/r... ■ FILE: Tlbinf32.exe : Help Files for Tlbinf32.dll http://support.microsoft.com/kb/224331/en-us ■ ADO API リファレンス http://msdn.microsoft.com/library/ja/jpado260/htm/mdmscadoapiref...
完璧すぎる回答いただきましてなんだか恐縮です。
大変ありがとうございました。
今後ともよろしくお願いいたします。
Visual Studio の表ですが、ListView to CSV というのを使ってみたところ上手く取得できました。
CSV 形式で出力されるので、エクセルで簡単に加工できると思います。
なるほど、こういう手もあるのですね。
他の用途にも使えますね。
ありがとうございます。
完璧すぎる回答いただきましてなんだか恐縮です。
大変ありがとうございました。
今後ともよろしくお願いいたします。