今日のトラックバック - つくばエクスプレス2007年06月01日 17時25分58秒

久々にスルーできませんでした。またもsbloです。

タイトル:つくばエクスプレス 内容:つくばエクスプレス開通によって選択肢が広がった つくば&アキバお勧めマンスリー

タイトルも内容も特に目を引くところはないのだが、どうしてシリコングリスすげぇにトラックバックするのか。(追記:考えてみたらアキバつながりだわな)

まあ、それはいいとしても、ホストが「tukubaekusu」とは。

それもいいとしても、エントリが3つとは。しかも最新エントリが2007/05/06で、出だしが

去る8月24日、つくばエクスプレスが開業しました。
とは。

そこまではいいとしても、唯一のカテゴリ「つくばエクスプレスについて」の件数が0ってどうよ。どっかからのコピペ記事だとしてもさー、カテゴリくっつけるくらいやってもいいじゃん。もうすこしがんばろうよ。

電源操作2007年06月02日 05時16分27秒

がさっと作ってみますた

昨日のエントリで拾ったコマンドラインから電源操作ネタでちょっとしたスクリプトを書いてみた。

なんのひねりもないクラス名だが、こんな感じ。

var PowerManager = function() {
	this.initialize.apply( this, arguments );
}
PowerManager.prototype = {
	initialize : function() {
		this.shell = new ActiveXObject("WScript.Shell");
	},
	shutdown : function() {
		this.shell.Run( "shutdown -s -t 0" );
	},
	reboot : function() {
		this.shell.Run( "shutdown -r -t 0" );
	},
	suspend : function() {
		this.shell.Run( "rundll32 powrprof.dll,SetSuspendState" );
	}
}
つか、そもそもクラスにする意味ないっちゃないし。気にしないで。

使い方

もう、見てのとおり。shutdown()でシステム終了、reboot()で再起動、suspend()で休止状態(またはサスペンド)。

WshShell#Runでさくっとコマンド呼び出ししてるだけなので、shutdownとrebootは一瞬コンソールが表示される。どうせシステム終了するので放っておいてるが、気になるなら

shutdown : function() {
	this.shell.Run( "shutdown -s -t 0", 0 );
}
とかしておけば非表示実行できる。と思う。試してないけど。

応用例

というか、サンプルスクリプト。ショートカットを作って、渡すパラメータを変えて使うとかね。

var PowerManager = function() {
	this.initialize.apply( this, arguments );
}
PowerManager.prototype = {
	initialize : function() {
		this.shell = new ActiveXObject("WScript.Shell");
	},
	shutdown : function() {
		this.shell.Run( "shutdown -s -t 0" );
	},
	reboot : function() {
		this.shell.Run( "shutdown -r -t 0" );
	},
	suspend : function() {
		this.shell.Run( "rundll32 powrprof.dll,SetSuspendState" );
	}
}

// コマンドライン引数によって動作を決定
var p = WScript.Arguments.Unnamed.Length ? WScript.Arguments.Unnamed.Item(0) : "s";
var pm = new PowerManager();
var method = {
	s : "shutdown",
	r : "reboot",
	p : "suspend"
}[ p ] || "shutdown";

pm[ method ]();

注意事項つか

手持ちのPCのみの現象かもしらんが、shutdown()を実行すると「電源を切ってもよい」状態になるだけで実際に電源が切れない。他所様の環境ではわからん。

COMWinLibってなんやねん2007年06月03日 17時52分17秒

経緯

Google Gearsをインストールしたら、IE向けにはDLLが1個入るだけみたいだった。これ多分COMだろうな、と思ってVBAでオブジェクトブラウザを立ち上げてみたら、やっぱり「GearsTypelib」とやらができているので、COMでなんかできるっぽい。

で、ライブラリ探してるときに「Earth 1.0.Type Library」とかいろいろと興味深いものがちらほらと見つかったのだが、そのなかの1つに「COMWin 1.0.Type Library」てのがあった。

ライブラリの場所を見たところ、Microsoft Script Debuggerについてきてるやつみたいだ。(昔インストールしていた)

見てみよう

さっそくオブジェクトブラウザで開いてみると、「COMWindow」ってオブジェクトがあり、これが「CreateWindowEx」だの、「FindWindowEx」だの、ActiveXにあるまじき名前のメソッドが実装されてるっぽい。なんじゃこりゃーー。

newしてみる

ともかく、

var cw = new ActiveXObject("COMWinLib.COMWindow");
としてみると、「オートメーション サーバーはオブジェクトを作成できません」。 はて、したらこれでどうだ。
var cw = new ActiveXObject("COMWindow");
おお、エラーでないよ。これでいいんか。

ほんじゃまず引数取らないやつから試すか。

var w = cw.GetDesktopWindow();
「オブジェクトでサポートされていないプロパティまたはメソッドです」だそうだ。はて?

VBS経由して型を調べてみたら、COMWindowではなくIWindowDispになっていた。ほんじゃそっちのメソッドを試してみよう。

cw.IsWindow(); // → false
cw.IsWindowEnabled(); // → false
cw.IsWindowVisible(); // → false
ぜんぜんだめじゃん。お、「GetParent()」なんてのがある。
var p = cw.GetParent(); // → pもIWindowDisp

p.IsWindow(); // → false
p.IsWindowEnabled(); // → false
p.IsWindowVisible(); // → false
なんじゃそれ。

情報がほしい...

まぁ、メソッドの定義とか見てると、引数の中に

uType AS <サポートされていないバリアント型>
とかorzな記述があったりで、WSHからシンプルに使えるライブラリじゃなさそうなんだけど、「COMWinLib」とか「comwin.dll」とか見てもほとんど情報が見つからないのでものすごく気になってる。

追記:「サポートされないバリアント型」はIWindowDisp#MessageBoxにあったんだが、VC#2005でtlbimpしてみたらuintとかでマーシャリングされてたのでふつーにNumber渡して問題なかった。

だれかなんか情報しらないかなー