Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-11-01風邪治らない

COMの列挙再び

| 04:38 |  COMの列挙再び - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  COMの列挙再び - Ci.nsIZIGOROu

幾つか方法がある。

WMIのWQLを使う

var locator = new ActiveXObject("WbemScripting.SWbemLocator");
var service = locator.ConnectServer(null, "root\\cimv2");
var rs = service.execQuery("SELECT * FROM Win32_ClassicCOMClassSetting WHERE ProgID <> NULL");

WScript.Echo(rs.count);

var rsEnum = new Enumerator(rs);

for (; !rsEnum.atEnd(); rsEnum.moveNext()) {
  WScript.Echo(rsEnum.item().ProgId);
}

ちなみにこの時取れるカラムは以下のとおり。

  • AppID
  • AutoConvertToClsid
  • AutoTreatAsClsid
  • Caption
  • ComponentId
  • Control
  • DefaultIcon
  • Description
  • InprocHandler
  • InprocHandler32
  • InprocServer
  • InprocServer32
  • Insertable
  • JavaClass
  • LocalServer
  • LocalServer32
  • LongDisplayName
  • ProgId
  • SettingID
  • ShortDisplayName
  • ThreadingModel
  • ToolBoxBitmap32
  • TreatAsClsid
  • TypeLibraryId
  • Version
  • VersionIndependentProgId

このカラム名も取得できます。

var pEnum = new Enumerator(rsEnum.item().Properties_);
for (; !pEnum.atEnd(); pEnum.moveNext()) {
  WScript.Echo(pEnum.item().name);
}

ただどういう訳か、一部列挙出来ない物があるみたい。

WMIのセキュリティ設定が云々っぽぃんだけど謎。

WMIからRegStdProvオブジェクトを使う

serviceの取得手順がちょっと違う。

// これ専用、Array.prototype.forEachがあればウマーなんだけどな
Enumerator.prototype.toArray = function() { 
  var result = []; 
  this.moveFirst(); 
  for (; !this.atEnd(); this.moveNext()) {
    result.push(this.item().name); 
  } 
  this.moveFirst(); 
  return result; 
};

var locator = new ActiveXObject("WbemScripting.SWbemLocator"); // [object SWbemLocator]
var service = locator.ConnectServer(null, "root\\default"); // [object SWbemServicesEx] 第二引数の値が違う
var srp = service.Get("StdRegProv"); // [object SWbemObjectEx]

// メソッド名列挙
var mEnum = new Enumerator(srp.Methods_);
WScript.Echo(mEnum.toArray().join(","));
// CreateKey,DeleteKey,EnumKey,EnumValues,DeleteValue,
// SetDWORDValue,GetDWORDValue,SetStringValue,GetStringValue,
// SetMultiStringValue,GetMultiStringValue,SetExpandedStringValue,
// GetExpandedStringValue,SetBinaryValue,GetBinaryValue,CheckAccess

var method = srp.Methods_.item("EnumKey"); // [object SWbemMethod]
var params = method.InParameters.SpawnInstance_(); // [object SWbemObjectEx]

// メソッドのパラメータ列挙
var pEnum = new Enumerator(params);
WScript.Echo(pEnum.toArray().join(","));
// hDefKey,sSubKeyName

params.hDefKey = 0x80000000; // HKEY_CLASSES_ROOTの値
params.sSubKeyName = "CLSID";

var rs = srp.execMethod_(method.name, params); // [object SWbemObjectEx]

WScript.Echo(rs.ReturnValue);
WScript.Echo(rs.sNames.toArray()); // これでCLSIDが全部列挙される

が、しかしWMIを使うとどうしても列挙出来ない奴がある。(MSWInsock.Winsockとか)

あとEnumerator使いまくると便利。

予めEnumerator, Array辺りはprototype拡張必要かも。

具体的には、

params.sSubKeyName = "MSWinsock.Winsock\\";

として実行するとCLSIDとかキー名が列挙出来てもいいはずなんだけど出来ない。

一方で、WScript.ShellのRegReadすると見事に取れる。

var wshell = new ActiveXObject("WScript.Shell"); 
WScript.Echo(wshell.RegRead("HKCR\\MSWinsock.Winsock\\CLSID\\"));
// {248DD896-BB45-11CF-9ABC-0080C7E7B78D}
WScript.Echo(wshell.RegRead("HKCR\\CLSID\\{248DD896-BB45-11CF-9ABC-0080C7E7B78D}\\VersionIndependentProgID\\"));
// MSWinsock.Winsock

なんでやねん!!!

ZIGOROuZIGOROu2007/11/03 04:15RegSrvc.Registry

ZIGOROuZIGOROu2007/11/03 04:29COMAdmin.COMAdminCatalog

ZIGOROuZIGOROu2007/11/03 04:32TxCTx.TransactionContextEx

ZIGOROuZIGOROu2007/11/03 04:47COMSVCSLibがあつそうだ

ZIGOROuZIGOROu2007/11/03 04:49COMCRFLibはパーサー用っぽぃな

ZIGOROuZIGOROu2007/11/03 04:51COMEXPSLibはメニューとかかな

2007-10-23

WMI (1)

| 04:20 |  WMI (1) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  WMI (1) - Ci.nsIZIGOROu

とりあえず

var locator = new ActiveXObject("WbemScripting.SWbemLocator");
var service = locator.ConnectServer(null, "root\\cimv2"); // ここまでおまじない
var com = service.execQuery("SELECT * FROM Win32_ClassicCOMClassSetting WHERE ProgID <> NULL AND TypeLibraryId <> NULL");

このいかにもSQLちっくな奴はWQLと言うらしい。ってかほぼSQLです。w

LIKE句も使えた。

このテーブルもどきみたいな奴は、WMI Classes | Microsoft Docs辺りから漁れるみたい。

ちなみにWQL使った検索、めちゃくちゃ早い。Registryなんて見ちゃダメだたね。



WMIとProgIDメモ

| 03:39 |  WMIとProgIDメモ - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  WMIとProgIDメモ - Ci.nsIZIGOROu

  1. WbemScripting.SWbemDateTime
  2. WbemScripting.SWbemLastError
  3. WbemScripting.SWbemLocator
  4. WbemScripting.SWbemNamedValueSet
  5. WbemScripting.SWbemObjectPath
  6. WbemScripting.SWbemRefresher
  7. WbemScripting.SWbemSink

むぅ、多いなぁ。

参考

  1. Document Conventions for the Scripting API | Microsoft Docs
  2. Scripting API Object Model | Microsoft Docs

2007-08-08一度痛い目に遭った方がいい

StdRegProv.EnumKey()で使うRegistryのルート

| 17:24 |  StdRegProv.EnumKey()で使うRegistryのルート - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  StdRegProv.EnumKey()で使うRegistryのルート - Ci.nsIZIGOROu

NameValue
HKEY_CLASSES_ROOT 2147483648, 0x80000000
HKEY_CURRENT_USER 2147483649, 0x80000001
HKEY_LOCAL_MACHINE 2147483650, 0x80000002
HKEY_USERS 2147483651, 0x80000003
HKEY_CURRENT_CONFIG 2147483653, 0x80000005
HKEY_DYN_DATA 2147483654, 0x80000006