< FindClose | NT 系のログオンスクリプトの場所 >

July 15, 2004

VBからコールするダンプログDLL

// VBDebugLog.h
#ifndef _VBDEBUGLOG_H_
#define _VBDEBUGLOG_H_

#ifdef VBDEBUGLOG_EXPORTS
#define DECLSPEC_DLLPORT	__declspec(dllexport)
#else	// VBDEBUGLOG_EXPORTS
#define DECLSPEC_DLLPORT	__declspec(dllimport)
#endif	// VBDEBUGLOG_EXPORTS

#ifdef __cplusplus
extern "C"{
#endif	// def __cplusplus

//========================================================================
//
//========================================================================
//
// 各種定義
//


//========================================================================
//
//========================================================================
//
// 関数プロトタイプ
//

//------------------------------------------------------------------------
//   DebugLogBin	(ログファイルに書き込み、ダンプ表示)    
//------------------------------------------------------------------------
//  [ReturnCode] | TRUE 正常終了  FALSE 異常終了
//------------------------------------------------------------------------
//  [備考] 
//------------------------------------------------------------------------
/*	[VBの宣言]
	Declare Function DebugLogBin _
		Lib "SMC_ComLog.dll" _
	(ByVal pstrLogMode As String _
	, ByVal pstrProcName As String _
	, ByVal pstrDumpLabel As String _
	, ByVal pstrLogPath As String _
	, panyDumpData As Any _
	, ByVal plngBytesData As Long ) As Long 
*/
//------------------------------------------------------------------------
DECLSPEC_DLLPORT 
BOOL WINAPI DebugLogBin(
	LPCTSTR	lpszLogMode,	// (in)	ログモード VB用にあえて文字列で
	LPCTSTR	lpszProcName,	// (in)	プロシージャ名	
	LPCTSTR	lpszDumpLabel,	// (in)	ダンプデータに付ける名前
	LPCTSTR	lpszLogPath,	// (in) ログのパス
	LPVOID	lpDumpData,		// (in)	ダンプしたいデータ
	DWORD	dwBytesOfData	// (in)	バイト数
);


#ifdef __cplusplus
}	// extern "C"
#endif	// def __cplusplus
#endif	// ndef _VBDEBUGLOG_H_
// VBDebugLog.c
#define WIN32_LEAN_AND_MEAN
//========================================================================
//
//========================================================================
//
// インクルード
//
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include "VBDebugLog.h"

//========================================================================
//
//========================================================================
//
// 定義
//

#define DUMP_HEADER			"---- ----  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF\r\n"
#define CHAR_ASCII_CTLCODE	'.'
#define RETRY_FILEOPEN		5



//========================================================================
//
//========================================================================
//
// 関数の実装
//

//------------------------------------------------------------------------
//   DebugLogBin	(ログファイルに書き込み、ダンプ表示)    
//------------------------------------------------------------------------
//  [ReturnCode] | TRUE 正常終了  FALSE 異常終了
//------------------------------------------------------------------------
//  [備考] 
//------------------------------------------------------------------------
DECLSPEC_DLLPORT 
BOOL WINAPI DebugLogBin(
	LPCTSTR	lpszLogMode,	// (in)	ログモード VB用にあえて文字列で
	LPCTSTR	lpszProcName,	// (in)	プロシージャ名	
	LPCTSTR	lpszDumpLabel,	// (in)	ダンプデータに付ける名前
	LPCTSTR	lpszLogPath,	// (in) ログのパス
	LPVOID	lpDumpData,		// (in)	ダンプしたいデータ
	DWORD	dwBytesOfData	// (in)	バイト数
)
{
	BOOL	bResult			= TRUE;			// 関数の戻り値

	HANDLE	hFile			= NULL;			// ファイルハンドル
	DWORD	dwRetryCount	= 0;			// リトライカウンタ
	DWORD	dwBytesToWrite	= 0;			// 書き込みバイト数
	DWORD	dwBytesWritten	= 0;			// 書き込まれたバイト数
	TCHAR	szWriteBuffer[1024];			// 書き込みバッファ

	SYSTEMTIME	LocalTime;					// 時刻取得用

	LPBYTE	pBuffer			= NULL;			// データポインタ
	DWORD	dwBytesCount	= 0;			// バイト数カウンタ
	TCHAR	szLine[12];						// 行数表示用
	TCHAR	szHex[64];						// ヘキサダンプ用ワーク用
	TCHAR	szAscii[64];					// ASCIIダンプ用ワーク
	TCHAR	*pHex = NULL, *pAscii = NULL;	// 各種ポインタ
	


	
	// この3つの引数はNULLはNG
	if ( !( lpszLogMode && lpszLogPath && lpDumpData ) )
		return FALSE;
	
	// ファイルオープン
	dwRetryCount = RETRY_FILEOPEN;
	while ( INVALID_HANDLE_VALUE == ( hFile = CreateFile( lpszLogPath,
														GENERIC_WRITE | GENERIC_READ,
														FILE_SHARE_READ | FILE_SHARE_WRITE,
														(LPSECURITY_ATTRIBUTES)NULL, 
														OPEN_ALWAYS,
														FILE_ATTRIBUTE_NORMAL, 
														(HANDLE)NULL ) ) ) 
	{
		// リトライカウント
		if ( !dwRetryCount-- ) {
			return FALSE;
		}
		Sleep( 100 );
	}

	// ファイルポインタ移動
	SetFilePointer( hFile, 0, NULL, FILE_END );
	
	// ログデータ
	memset( (void *)&LocalTime, 0x00, sizeof( LocalTime ) );
	GetLocalTime( &LocalTime );
	dwBytesToWrite	= _stprintf( szWriteBuffer, 
							  "%c [%4d/%02d/%02d %02d:%02d:%02d] [%4d] [%-40.40s] %s (%d bytes)\r\n",
							  *lpszLogMode,
							  LocalTime.wYear, LocalTime.wMonth, LocalTime.wDay, 
							  LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
							  GetCurrentProcessId(),
							  lpszProcName? lpszProcName: "",
							  lpszDumpLabel? lpszDumpLabel: "NO NAME",
							  dwBytesOfData );
	if ( !( bResult = WriteFile( hFile, szWriteBuffer, dwBytesToWrite, &dwBytesWritten, (LPOVERLAPPED)NULL ) ) ) {
		// エラー
	}

	// ダンプヘッダ
	else if ( !( bResult = WriteFile( hFile, DUMP_HEADER, sizeof( DUMP_HEADER ) - 1, &dwBytesWritten, (LPOVERLAPPED)NULL ) ) ) {
		// エラー
	}
	
	// ダンプ部
	else {
		pBuffer = (LPBYTE)lpDumpData;

		while ( dwBytesCount < dwBytesOfData ) 
		{

			// 行数
			_stprintf( szLine, _T( "%04X %04X" ), HIWORD( dwBytesCount ), LOWORD( dwBytesCount ) );

			// ポインタ初期化
			memset( (void *)szHex, '\0', sizeof( szHex ) );
			memset( (void *)szAscii, '\0', sizeof( szAscii ) );
			pHex	= szHex;
			pAscii	= szAscii;

			// 1行分ダンプ
			do
			{
				// HEX部分
				_stprintf( pHex, _T( "%02X " ), *pBuffer );
				pHex += 3;
				
				// ASCII部分
				if ( 0x20 > *pBuffer ) {
					*pAscii	= CHAR_ASCII_CTLCODE;
				}
				else {
					*pAscii	= *pBuffer;
				}
				pAscii++;
				
				// バイト位置をインクリメント
				pBuffer++;
				dwBytesCount++;

			} while ( ( dwBytesCount % 0x0000010 ) && ( dwBytesCount < dwBytesOfData ) );
			
			// 行の組み立て
			dwBytesToWrite = _stprintf( szWriteBuffer, _T( "%s  %-48.48s %-16.16s\r\n" ), szLine, szHex, szAscii );
			
			// ファイルに書き込む
			if ( !( bResult = WriteFile( hFile, szWriteBuffer, dwBytesToWrite, &dwBytesWritten, (LPOVERLAPPED)NULL ) ) ) {
				break;
			}

		}	// while ( dwBytesCount < dwBytesOfData )

		// 最後の改行を追加
		if ( bResult ) {
			bResult = WriteFile( hFile, "\r\n", 2, &dwBytesWritten, (LPOVERLAPPED)NULL );
		}
	}
	
	// ファイルクローズ
	CloseHandle( hFile );

	return bResult;
}
// VBDebugLog.def
LIBRARY VBDebugLog

EXPORTS
	DebugLogBin

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/561

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?