frog.raindrop.jp

.knowledge
::November 2004

SUN MON TUE WED THU FRI SAT
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

B L O G T I M E S

Prev: October 2004

Next: December 2004

Last Modified
July 10, 2009 03:57 PM

Search



あわせて読みたいブログパーツ
RSS feed meter for http://frog.raindrop.jp/
counter
< October 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>

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