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はメニューとかかな

MatwoonryMatwoonry2019/07/29 00:11Viagra For Less Pharmacy Rx One Review Viagra Prescription <a href=http://etrobax.com>where to buy cialis online safely</a> Come Comprare Viagra Senza Ricetta Medica

MatwoonryMatwoonry2019/07/31 19:38Levitra 10mg Generique Worldwide Pharmacy Ventalin <a href=http://cheapcheapvia.com>viagra</a> Cialis Discount Coupon Generic Prevacid Online

MatwoonryMatwoonry2019/08/03 21:44Determining Correct Amoxicillin Dosage Cephalexin For Dog Tadalafil 5 Mg Best Price Usa <a href=http://genericcial.com>cialis for sale</a> Viagra 50mg Wirkung

MatwoonryMatwoonry2019/08/06 16:27When Will Alli Be Back In Stock Cialis Prix France Pharmacie <a href=http://drugs20.com>cialis from canada</a> Zithromax Zpak Cialis Fast Delivery