2003-11-30

[2003-11-23] の「Microsoft Bookshelf Version 3.0 でWZから単語検索」の続き。

見えてきたCOM(遅)

あのような、TX-CでWSHのスクリプトコードをせこせこ生成してそれを実行するという方式が最近では結構増えてきましたが、これはこれで「なんだかなぁ」という気になるのも確か。できればTX-Cのみの力によって実現できたほうが、達成感はあります(換言すれば、純粋に気持ちの問題)。

TX-Cから直接COMオブジェクトをいじれないかと、MSDNの記事等を調べて挑戦してみたところ、なんとか動くところまで持っていけました。

Microsoft Bookshelf Version 3.0 でWZから単語検索 COM 自力解決版
http://www.emptypage.jp/download/bsdef.zip

アーカイブに今回行った手順のメモを同梱しておきました。たぶんネタ的には上級者向けのトピックだと思われるので、意味不明でもご安心ください。あなたは正常です。

とはいえ、前回も書いたとおり、Bookshelfは、アプリを問わずにホットキーで範囲選択中の単語を検索できるので、これは言ってみれば、わざわざもっとも険しい道を通ってゴールにたどり着くようなもの。本命はCOMを介さないとできないと思われる処理、例えば……。

Visual Studio .NET ドキュメントでWZから単語検索

Visual Studio .NETのヘルプ、「Visual Studio .NET 連結ヘルプ コレクション」は、Microsoft Document Explorer (dexplore.exe)というアプリケーションを介した新しい形式のものになっています。これまでのWinHelpやHTML Help形式ではWin32 APIを使えば呼び出せたのですが、dexplore.exeにはそれらしきAPIはない模様。すでにCOMインタフェースが用意されていることは知っていたのですが(cf. DExplore COM Interface)、こいつはBookshelfの場合と違って、呼び出し元のインスタンスが終了すると自動的にウィンドウも破棄されてしまうので、WSHのスクリプトを書いてそれを走らせるという方法が使えなかったのです(単語を検索させることはできるが、スクリプトが最後まで実行された瞬間にwscript.exeとともに消えてしまう)。

それが、今回COMの使い方が見えてきたことでついに実現可能に! って、あんまりひっぱるのもアレなので、能書きはこのへんで。

Visual Studio .NET ドキュメントでWZから単語検索
http://www.emptypage.jp/download/vshelp.zip

vshelp.mainを実行すると、カーソル位置の単語を取得して、Visual Studio .NETのヘルプでキーワード検索を行います。よろしければご利用くださいませ。

追記

すごいすごい!(←大はしゃぎ)

2003-11-27

アナウンスだけはしておかねば。(←コピペ)

更新情報

まだペースト時に落ちることがあるようだったので、気になるところに手を入れてみた(弱気)「[最近使った文字列]拡張 2(strhist2)」1.02を公開しました。

2003-11-24

アナウンスだけはしておかねば。

更新情報

プレビューOFF時に文字列が正しく挿入されないのを修正した、「[最近使った文字列]拡張 2(strhist2)」1.01を公開しました。

2003-11-23

中村友次郎氏のお父様は小説を書かれていらしたのですね。

更新情報

コマンドラインの実行(cmdlinex)」2.16と、「[最近使った文字列拡張]拡張(strhist)」の後継、「[最近使った文字列拡張]拡張 2(strhist2)」1.00を公開しました。

cmdlinex 2.16は外観を大幅に変えてみました。次で内部的なところ(コマンドの実行部分)をごそっといじろうと思っているので、その前に変えられるところは変えておこうということで。

strhist2は旧作のソースのスパゲッティぶりに嫌気がさして書き直したものです。まあ、やってることが同じな以上、結果的には似たようなコードになってしまいましたが。

Microsoft Encarta 総合大百科 2004

お買い物日記 – 更新履歴(2003年11月) – Final β Laboratory
http://www.finalbeta.jp/update_log/2003_11.html#log20031121_1

びんごっ! 日本語はUTF-8でURIエンコードか。ふむふむ。これならSearchDDw+から簡単に制御できそうです。こんなに楽なのはエンカルタ99以来じゃなかろうか。

ああ、これ(コマンドライン引数で検索できる)だけでも今使っている「エンカルタ 総合大百科 2002」からバージョンアップする意味があるなあ。

ところで、付属のBookshelf 3.0というのは2002に付いていたものと同じものということなんでしょうか。もしそうなら……。

Microsoft Bookshelf Version 3.0 でWZから単語検索

……もしそうなら、こんなマクロを今ごろ書いても意味あるかしら……。

// bs3 - Microsoft Bookshelf Version 3.0 で単語検索
void main(TX *text)
{
    txstr szfind;
    txGetWordWhole(text, szfind);
    txstr szfilename;
    pathFullConfig(szfilename, "¥m.vbs");
    TX *textScript = textopen(szfilename);
    txDeleteText(textScript);
    txInsert(textScript, "Set BSDef = WScript.CreateObject(¥"BsDefine.BsDefine.2¥")¥n");
    txInsert(textScript, "BSDef.InvokeDefine(¥"" + szfind + "¥")¥n");
    txSave(textScript);
    textclose(textScript);
    shellExecute(szfilename, "open");
}

もっともBookshelf 3.0はホットキーでアプリを選ばず単語検索できるわけですが。まあ制御方法がわかったぞと、それが言いたかっただけです(笑)。

2003-11-20

宗教論争に火を点けろ(笑)!

べつにWZマクロに限らずC言語系の言語一般にあてはまるのではないかと思うのですが。

以下の例では、fooというFOOオブジェクト(typedefされた構造体)を作成して、そこからなにやら文字列を取得していると考えてください(シチュエーションは適当にでっち上げたので必然性に乏しいですがご勘弁を)。

void sample1(TX *text)
{
    FOO *foo = fooNew();
    if (foo) {
        DWORD sizeBuff = fooGetStringLength(foo) + 1;
        mchar *pszBuff = malloc(sizeBuff);
        if (pszBuff) {
            fooGetString(foo, pszBuff, sizeBuff);
            printf("%s", pszBuff);
            free(pszBuff);
        }
        fooDelete(foo);
    }
}

これは以下のようにも書けますよね。

void sample2(TX *text)
{
    FOO *foo = fooNew();
    if (!foo) return;
    DWORD sizeBuff = fooGetStringLength(foo) + 1;
    mchar *pszBuff = malloc(sizeBuff);
    if (!pszBuff) {
        fooDelete(foo);
        return;
    }
    fooGetString(foo, pszBuff, sizeBuff);
    printf("%s", pszBuff);
    free(pszBuff);
    fooDelete(foo);
}

さて、どっちがいいのでしょう。とくに、後者でfooDelete(foo);が二つ出てくることになるのはどうなんでしょう?