メモの日々


2001年08月20日(月) 晴れ

[windows][security] 2001 年 8 月 15 日 IIS 用の累積的な修正プログラム (MS01-044)

IISのパッチが出てます。なぜかメイルでは流れてこない。児玉くんからのメイルで知った。なんでや。

会社など

  • 夜は雨らしい。
  • 月曜日は忙しいなあ。午前中は何もできない。
  • 最近ShingenGetの調子が悪くてエラーメイルが毎日来る。おれも忙しいのでほっておく。
  • バイオハザード怖くてずっとやってない。怖いよー。
  • メイルの実験しようとしたけどうまくいかない。SMTPサーバを起動してもメイル出せない。インターネットサービスマネージャに表示されないのがおかしいな。夜もう一度やろうか。
  • 目標を入れようとしたけどさっぱり思いつかない。
  • 腹減った。飴ばかり舐めている。体に悪い。
  • スクリプト作成をfixしたので少し楽になった。でも、やらねばならないことはたくさんあるのだ。どれから手をつけたらいいのか分からない。うーむ、どれもやりたくない。
  • やること一覧
    • テーブル作成スクリプトの更新
    • 運用監視項目のまとめ
    • メイル送信テスト
    • SSLのテスト
    • テスト用ウェブサーバの構築
    • 実行計画書を書く
    • 目標設定をする
  • 明日は何からやろうかな。万が一朝早ーく来れたらメイル送信のテストをしよう。万が一今日の帰りに目標がまとまったなら目標を入力しよう。だめなら、運用監視項目のまとめからやろうかな。その次はテーブル作成スクリプトの更新ね。

2002年08月20日(火) 台風去って晴れの日

会社

  • 15:30 SFAでチェックインしていなかったファイルをチェックインした。はじめ間違えて高本さんの名前でチェックインしてしまい、ロールバックしたり色々面倒な作業になってしまった。チェックアウトしっぱなしは気を付けて下さい。
  • 17:20 メイル読み終わったところ。これから教育計画を作成してみせましょう。
  • 〜17:50 教育計画作成した。虚しい。
  • 18:00〜18:30 自分のPCにWindowsSP3をインストールした。30分はかかるわな。再起動直後は不安定だったがログインしなおしてからはちゃんと動いている。SP3インストール後にWindowsUpdateを覗いたら2つの重要な更新があった。いたちごっこやな。

[dev] LinuxとWindowsのハイパフォーマンス・プログラミング手法

LinuxとWindowsのプロセス/スレッドの扱い方の比較かな。java@jp.freebsd.org MLより。

[web] Macromedia - DevNet : Blueprint Application

ColdFusionで実装したペットマーケット。jcfug MLより。Javaの真似ではないのかしら。日本語だし役に立つのは確かだろう。

Iプロジェクト

  • 15:00〜17:00 高本吉田水野兒玉と打ち合わせ。30日に行うデモについての打ち合わせのようであったが色々な話をごっちゃにしたので結局よく分からなくなってしまった。
  • 21:30 プログラムを直したりしていた。一区切りした。

Kプロジェクト

  • 13:30 朝から監視の続きなどKばかり。これからメイル書くのだ。
  • 14:40 メイル書いたのだ。一時間以上経っているではないか。もー。
  • 15:31 そうだ、バグっぽいエラーが出ていたのを調べないと。後回しだ。

2003年08月20日(水)

[windows] Microsoft Data Access Components (MDAC) 2.8 (Microsoft)

MDAC2.8の英語版が出ていたのだ。早く日本語版出ないかなあ。家計簿ソフト復活への一抹の希望なのだ。PASSJ dba MLより。

家計簿はとりあえずOpenOficceOffice.orgで「現金主義」を使ってみている。

[link] 自転車のパンク修理 (Travel is MY LIFE)

絵が分かりやすかったのでメモ。fj.questions.miscより。未だにパンク修理したことない。ってか自転車全然乗ってない。

[java] Topic: Create a temp directory (Java Technology Forums)

以前、Javaで一時ディレクトリを簡単に作るにはどうしたらいいのだろうとぼやいたけれど、それへの回答があった。

1) use File.createTempFile() to create a temporary file

2) get the name of the file created

3) delete the temporary file

4) use the temporary file name as the name of your temporary directory

だって。結局お手軽な方法はないのかな。ネバーバード日記より。

[サッカー] 日本vsナイジェリア

を見る。曽々端宮本坪井山田暢久三都主遠藤稲本中村中田英寿高原柳沢の先発。柳沢ころころ転ぶフリーで決められない、ジーコ交代枠使わない。ハラハラしないつまらない試合だった。

やること

  • 電気カミソリを買う

2012年08月20日(月)

[windows][c++] Windowsでアクティブウィンドウのタイトルを取得

MinGW-w64を使って、初めてWindowsプログラミングをしてみる。手始めにアクティブウィンドウのタイトルを取得してみた。JNIから使えるライブラリとして実装する。色々難しい。.net frameworkを使えばきっともっと簡単なんだと思う。

APIのリファレンス

APIの一覧を知りたいのだけれど、それが分かるページがよく分からない。一応、

から辿れそうなんだけど、APIリファレンスじゃないページも混じっていて頑張らないと見つけられない。日本語訳が

みたい。ここの「Windows 2000」の下をよく探すとカテゴリ毎にリファレンスが見つかる。

アクティブウィンドウを得る

GetForegroundWindowという関数でアクティブウィンドウのハンドルを得られる。これは簡単。

ウィンドウタイトルを得る

GetWindowTextという関数でウィンドウのタイトルを得られる。ウィンドウタイトルを保存する領域が必要になるので、事前にGetWindowTextLengthで文字数を調べる必要がある。

で、GetWindowText()の引数の型がLPTSTRとなっていて、これが難しかった。WindowsのAPIの実装というのはワイド文字版とマルチバイト文字版の2種類があって、その違いを意識しないために文字にはTCHARという型を使っているようである。LPTSTRというのは TCHAR* のことみたい。

で、TCHARがワイド文字(wchar_t)なのかマルチバイト文字(char)なのかは、UNICODEというマクロが定義されているかどうかで決まっている模様。

書いてみたら難しくなかった。

LPTSTRをJavaの文字列へ変換

JNIを使うので、GetWindowText()で得た文字列をJavaの文字列へ変換しないといけない。このときに、TCHARがワイド文字なのかマルチバイト文字なのかで処理を分ける必要がある。

Javaの文字列生成にはNewStringを使う。これに渡すパラメータは「Unicode文字列を参照するポインタ」とある(型はconst jchar*)。Unicode文字列ってのはUTF16のことなのかなあ。

ちゃんと理解していないのだけれど、Windowsのwchar_tはUTF16のようで、TCHARがワイド文字を表す場合はLPTSTRをjchar*へキャストしたものをNewString()へ渡すことでちゃんと文字列を得られた。

TCHARがマルチバイト文字を表す場合はMultiByteToWideCharというWindowsのAPIでワイド文字に変換すれば、上と同じくjchar*へキャストすることでJavaの文字列を得られた。

ワイド文字とマルチバイト文字の選択方法

MinGW-w64のFAQにUnicode applicationsというページがあって、

To compile Unicode applications, define _UNICODE and UNICODE in your files when compiling and add -municode when linking.

とあった。なので、ワイド文字モードにするには、コンパイル時に「-D_UNICODE -DUNICODE」を、リンク時に「-municode」をg++のオプションとして与えればよさそう。これらをしないとマルチバイト文字モードになるようだ。

ソースコード

アクティブウィンドウのタイトルを取得するJNI関数を書いたのでメモしておく。やっつけなので醜いです。あー、このままだとC++の例外発生時にJVMが終了してしまうので、せめて例外をcatchしておく処理が必要だ。

#include <windows.h>
#include <winnls.h>
#include "sample_Windows.h"

JNIEXPORT jstring JNICALL Java_sample_Windows_activeWindow(
        JNIEnv *env,
        jclass) {
    HWND handle = GetForegroundWindow();
    if (!handle) return env->NewStringUTF("");

    int length = GetWindowTextLength(handle);
    if (!length) return env->NewStringUTF("");

    LPTSTR buffer = new TCHAR[length + 1]; 
    length = GetWindowText(handle, buffer, length + 1);

    jstring result;
#ifdef UNICODE
    result = env->NewString((jchar*)buffer, length);
#else
    int wide_length = MultiByteToWideChar(CP_ACP, 0, buffer, -1, 0, 0);
    if (!wide_length) {
        delete[] buffer;
        return env->NewStringUTF("");
    }

    LPWSTR wide_buffer = new WCHAR[wide_length];
    if (!MultiByteToWideChar(CP_ACP, 0, buffer, -1, wide_buffer, wide_length)) {
        delete[] wide_buffer;
        delete[] buffer;
        return env->NewStringUTF("");
    }

    result = env->NewString((jchar*)wide_buffer, wide_length);
    delete[] wide_buffer;
#endif

    delete[] buffer;
    return result;
}