< October 2004 | November 2004 | December 2004 >

November 19, 2004

IE をぎょうさん起動したいとき

ASP のテストで、同時最大セッション数を超えるとエラー表示する、みたいな項目があったが、最大セッション数分手でブラウザを起動するのが面倒だった。セッション数だけ稼げれば別にブラウザは何でも良かったので、IE でいいやって WSH スクリプトを作成。

// NavMaxSess.js
var MAX_SESSION = 100;
for (var i = 0; i < MAX_SESSION; i++) {
    var oIE = WScript.CreateObject ("InternetExplorer.Application");
    oIE.Visible = true;
    oIE.Navigate2 ("http://aspserver/target.asp");
}

小品ですが、結構重宝してます。

November 9, 2004

Service のデバッグ

サービスプログラムのデバッグがしたくて、 ServiceMain と、Handler 関数をエクスポートしてみた。
// MyService.def
EXPORTS
	ServiceMain
	Handler
さらに、テストプロを書いてみる
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>


#define MODULE_NAME         "MyService.exe"
#define FUNCNAME_MAIN       "ServiceMain"
#define FUNCNAME_HANDLER    "Handler"
int    main (int argc, char **argv)
{
    HMODULE     hModule    = NULL;
    char        szCurrent[MAX_PATH];
    char        szModule[MAX_PATH];
    DWORD       dwRet    = 0;

    LPSERVICE_MAIN_FUNCTION    lpfnServiceMain    = NULL;
    LPHANDLER_FUNCTION         lpfnHandler        = NULL;



    ZeroMemory (szCurrent, sizeof szCurrent);
    dwRet = GetCurrentDirectory (sizeof szCurrent, szCurrent);
    if (!dwRet)
    {
        fprintf (stderr, "GetCurrentDirectory err -->(%d)\n", GetLastError ());
    }
    else
    {
        ZeroMemory (szModule, sizeof szModule);
        wsprintf (szModule, "%s\\%s", szCurrent, MODULE_NAME);

        hModule = LoadLibrary (szModule);
        if (!hModule)
        {
            fprintf (stderr, "LoadLibrary err -->(%d)\n", GetLastError ());
        }
        else
        {
            lpfnServiceMain = (LPSERVICE_MAIN_FUNCTION) GetProcAddress (hModule, FUNCNAME_MAIN);
            if (!lpfnServiceMain)
            {
                fprintf (stderr, "GetProcAddress(ServiceMain) err -->(%d)\n", GetLastError ());
            }
            else
            {
                lpfnHandler = (LPHANDLER_FUNCTION) GetProcAddress (hModule, FUNCNAME_HANDLER);
                if (!lpfnHandler)
                {
                    fprintf (stderr, "GetProcAddress(Handler) err -->(%d)\n", GetLastError ());
                }
                else
                {
                    // とりあえず Handler をコールしてみた
                    lpfnHandler (SERVICE_CONTROL_CONTINUE);
                }
            }
            FreeLibrary (hModule);
        }
    }
    return 0;
}
結果は・・・呼び出せた。そんで動けば面白かったんだけど、サービスモジュール側でログ出力の処理がアクセスヴァイオレーションになってしまった。まあ、そううまくはいかないよね。一応、失敗談として。

November 5, 2004

FindFirstFile, FindNextFile, FindClose に関しての覚書

FindFirstFile
条件に合うファイルが見つからない場合も含め、有効なファイルを返せない場合は、INVALID_HANDLE_VALUE を返す。
条件に合うファイルが見つからない場合は GetLastError() は ERROR_FILE_NOT_FOUND が返る。
FindNextFile
条件に合うファイルが見つからない場合も含め、有効なファイルを返せない場合は、FALSE を返す。
条件に合うファイルが見つからない場合は GetLastError() は ERROR_NO_MORE_FILES が返る。
FindClose
FindFirstFile が成功しなかった場合は、ハンドルを渡してはいけない。ERROR_INVALID_HANDLE エラーを返したりなんていう、親切な実装はされていない。渡すとスレッドが死んでしまう。
CloseHandle と異なり、NULL ハンドルを渡しても死んでしまうようだ。もちろん、INVALID_HANDLE_VALUE もだめである。

November 3, 2004

Monthly アーカイブに BlogTimes を表示する

MTBlogTimes のサイトに書いてある、月ごとのファイル名で生成する方法ですが、実際にはうまくいかないんだよね。あれを真に受けて悩んだ人も多いのでは。で、ぐぐってみたらMTTagInvoke を MTBlogTimes に使う というステキな Tips を見つけた。早速、 Date-Based Archive に次のように追加して Rebuild した。

<!-- BlogTimes -->
<MTTagInvoke tag_name="MTBlogTimes" fillcolor="#999999" textcolor="#999999" linecolor="#ffffff" bordercolor="#ffffff" width="170" height="12" save_dir="images" show_text="on">
	<MTTagAttribute name="month"><$MTArchiveDate format="%Y%m"$></MTTagAttribute>
	<MTTagAttribute name="name"><$MTArchiveDate format="blogtimes-%Y-%b"$></MTTagAttribute>
	<MTTagContent><a href="http://nilesh.org/mt/blogtimes/" target="_blank"><img src="<$MTBlogTimesFileURL$>" width="<$MTBlogTimesWidth$>" height="<$MTBlogTimesHeight$>" border="0" alt="B L O G T I M E S" title="B L O G T I M E S" /></a></MTTagContent>
</MTTagInvoke>

出力結果は月別アーカイブ参照。