2009.10.31 Saturday | 09:49

  gd を c から ふるいむかし

ここにはソース長すぎるので。

gd を c から

LboxGd

if ( Commdlg->OpenFileName( FilePath ) ) {
	Dlg->EditSetText( IDC_READONLY, FilePath );
	if ( !(Gd->Load(FilePath)) ) {
		Dlg->MsgOk("ERR");
		break;
	}

	LboxString SavePath;
	Tool.ProgramDirectory( &SavePath );
	SavePath.AddBackslash();
	SavePath.operator += ("SAVE.PNG");

	LboxGd Gd2;

	Gd->Copy( &Gd2, 50 );

	Gd2.Save( &SavePath );
}


// *********************************************************
// 伸縮コピー
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxGd::Copy( LboxGd *objGD, int nRate )
{
	if ( this->lib == NULL ) {
		this->SetLibLoadErrorMessage();
		return false;
	}

	LPFUNC_gdImageCopyResampled Dll_gdImageCopyResampled;

	Dll_gdImageCopyResampled =
		(LPFUNC_gdImageCopyResampled)GetProcAddress(
			lib, "gdImageCopyResampled@40"
		);
	if ( Dll_gdImageCopyResampled == NULL ) {
		this->SetFuncLoadErrorMessage();
		return false;
	}

	int w,w2;
	int h,h2;

	this->GetImageSize( &w, &h );
	w2 = (double)w * ( (double)nRate / (double)100 );
	h2 = (double)h * ( (double)nRate / (double)100 );

	gdImagePtr im_in;
	gdImagePtr im_out;

	if ( !(objGD->Create( w2, h2 )) ) {
		return false;
	}

	im_in = (gdImagePtr)(this->gd);
	im_out = (gdImagePtr)(objGD->gd);

	Dll_gdImageCopyResampled(
		im_out,
		im_in,
		0, 0, 0, 0,
		w2, h2,
		w, h
	);

	return true;
}



2009.10.31 Saturday | 09:33

  SendMessage と PostMessage のフック ふるいむかし

こいつは dll である必要があります
// LboxHook.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "LboxHook.h"
#include <lightbox.h>

HINSTANCE hInst;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
	
	hInst = (HINSTANCE)hModule;

    return TRUE;
}


// これはエクスポートされた変数の例です。
LBOXHOOK_API int nLboxHook=0;

// これはエクスポートされた関数の例です。
LBOXHOOK_API int fnLboxHook(void)
{
	return 42;
}

// これはエクスポートされたクラスのコンストラクタです。
// クラスの定義については LboxHook.h を参照してください。
CLboxHook::CLboxHook()
{ 
	return; 
}

// SendMessge のフックハンドル
static HHOOK hhk = NULL;
// PostMessge のフックハンドル
static HHOOK hhkPost = NULL;

// *********************************************************
// SendMessge のフック処理
// *********************************************************
LRESULT CALLBACK CallWndRetProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhk, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		CWPRETSTRUCT *msg;
		char szClass[512];
		char szTitle[512];

		msg = (CWPRETSTRUCT *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"SEND:WM_COMMAND:"
					"%lu:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
		CloseHandle(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}
// *********************************************************
// PostMessge のフック処理
// *********************************************************
LRESULT CALLBACK GetMsgProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhkPost, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		MSG *msg;
		char szClass[512];
		char szTitle[512];

		msg = (MSG *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"POST:WM_COMMAND:"
					"%lu:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
		CloseHandle(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}

extern "C" { 
// *********************************************************
// システムフックのインストール
// *********************************************************
LBOXHOOK_API void Initialize( void )
{
	if ( hhk == NULL ) {
		// ミューテックス作成
		CreateMutex(
			NULL,
			false,
			"LboxHook"
		);

		// システムフックの実装
		hhk = SetWindowsHookEx(
			WH_CALLWNDPROCRET,
			CallWndRetProc,
			hInst,
			0				
		);
		hhkPost = SetWindowsHookEx(
			WH_GETMESSAGE,
			GetMsgProc,
			hInst,
			0				
		);
	}
}

// *********************************************************
// システムフック解放
// *********************************************************
LBOXHOOK_API void End( void )
{
	if ( hhk != NULL ) {
		UnhookWindowsHookEx( hhk );
		hhk = NULL;
	}
	if ( hhkPost != NULL ) {
		UnhookWindowsHookEx( hhkPost );
		hhkPost = NULL;
	}
}
}




2009.10.31 Saturday | 09:23

  DSN 作成 ( これは比較的新しい ) : 2006 ふるいむかし

システム DSN + MDB なんで、Tomacat 用に作った奴です。
#include "stdafx.h"

#include <windows.h>
#include <odbcinst.h>

int main( int argc, char *argv[] )
{
	// システム DSN 削除	
	SQLConfigDataSource(
		NULL,
		ODBC_REMOVE_SYS_DSN,
		"Microsoft Access Driver (*.mdb)",
		"DSN=jspMDBlightbox\0" 
	);

	char buff[4096];
	memset( buff, 0x00, 4096 );

	char *ptr;

	ptr = buff;
	strcpy( ptr, "DSN=jspMDBlightbox" );
	ptr += strlen( ptr ) + 1;
	strcpy( ptr, "DBQ=" );
	strcat( ptr, argv[1] );
	ptr += strlen( ptr ) + 1;
	strcpy( ptr, "MaxBufferSize=2048" );
	ptr += strlen( ptr ) + 1;
	strcpy( ptr, "PageTimeout=5" );
	ptr += strlen( ptr ) + 1;
	strcpy( ptr, "FIL=MS Access" );

	// システム DSN 作成	
	SQLConfigDataSource(
		NULL,
		ODBC_ADD_SYS_DSN,
		"Microsoft Access Driver (*.mdb)",
		buff
	);

	return 0;
}




2009.10.31 Saturday | 09:05

  MLOOP.H 利用サンプル ふるいむかし

要するに好きなループプロックを抜け出せるようにしていたんだっけ
たしか、while と for を統合していたような記憶もある・・・

MLOOP.H
//**********************************************************
//
//   複数ワイルドカード作成関数
//
//   wldline にセットされた複合ワイルドカードを、
//   単一のワイルドカードに分解し、chkwld でチェックする
//
//**********************************************************
extern
int
chkwldline( char *fname, char *wldline )
{

   int rtn;			// 戻り値

	char wldbase[128];		// トークン取り出し用のベースワーク
	int  basesw;			// strtok 用スイッチ
	int  basecnt;		// ベーストークン用カウンター
	char *baseptr[40];		// ベーストークンポインタ

	char *wldptr[40];		// 複合ワイルドカード(ファイルメイ)用トークンポインタ
	char *wldptr2[40];		// 複合ワイルドカード(カクチョウシ)用トークンポインタ
	int  wldcnt;			// ファイル名用カウンター	
	int  wldcnt2;		// 拡張子用カウンター
	char wlds[128];		// 複合ワイルドカード用ワーク
	int  wldsw;			// strtok 用スイッチ
	char *dptr;			// "." の次の文字列へのポインタ
	char *sts;			// "." の有無
	char chkstring[128];		// chkwld 用文字列エリア
	char ids[128];		// "." 以降のセーブエリア


//*********************************************************
//	初期設定
//*********************************************************
	rtn = -1;
	basesw = 0;
	strcpy( wldbase, wldline );
	AnsiUpper( wldbase );		// 小文字を大文字に変換


//*********************************************************
//	スペースを区切り文字として複合ワイルドカードの分解
//	し、ベーストークンを作成する
//*********************************************************
	basecnt = 0;
	MLOOP

		if ( basesw == 0 ) {
			baseptr[basecnt] = jstrtok( wldbase, " " );
			basesw = 1;
		}
		else {
			baseptr[basecnt] = jstrtok( NULL, " " );
		}

		if ( baseptr[basecnt] == NULL ) {
			BREAK(1)
		}

		basecnt++;
		if ( basecnt > 18 ) {
			baseptr[basecnt] = NULL;
			BREAK(1)
		}

	END


//*********************************************************
//	ベーストークンの繰り返し
//*********************************************************
	basecnt = 0;
	MLOOP

		if ( baseptr[basecnt] == NULL ) {		// 全く合致しなかった
			BREAK(1)
		}
						// ベーストークンをワークへ
		strcpy( wlds, baseptr[basecnt] );
		sts = strchr( wlds, '.' );		// "." の有無をチェツク
		if ( sts != NULL ) {
			dptr = jstrtok( wlds, "." );
			dptr = jstrtok( NULL, "." );		// dptr は拡張子の先頭を指す
		}

//*********************************************************
//	複合ワイルドカードに "." がない時
//*********************************************************
		if ( sts == NULL ) {

			wldsw = 0;
			wldcnt = 0;
			LOOP				// ファイル名の分解

				if ( wldsw == 0 ) {
					wldptr[wldcnt] = jstrtok( wlds, "/|" );
					wldsw = 1;
				}
				else {
					wldptr[wldcnt] = jstrtok( NULL, "/|" );
				}

				if ( wldptr[wldcnt] == NULL ) {
					BREAK(1)
				}

				wldcnt++;
				if ( wldcnt > 18 ) {
					 wldptr[wldcnt] = NULL;
					 BREAK(1)
				}

			ENDLOOP

			wldcnt = 0;
			LOOP				// チェックループ

				if ( wldptr[wldcnt] == NULL ) {
					BREAK(1)
				}

				rtn = chkwld( fname, wldptr[wldcnt] );
				if ( rtn == 1 ) {		// 一つでも合致するとOK
					BREAK(2)
				}
				wldcnt++;

			ENDLOOP

		}

//*********************************************************
//	複合ワイルドカードに "." がある時
//*********************************************************
		else {

			wldsw = 0;
			wldcnt = 0;
			LOOP				// ファイル名の分解

				if ( wldsw == 0 ) {
					wldptr[wldcnt] = jstrtok( wlds, "/|" );
					wldsw = 1;
				}
				else {
					wldptr[wldcnt] = jstrtok( NULL, "/|" );
				}

				if ( wldptr[wldcnt] == NULL ) {
					BREAK(1)
				}

				wldcnt++;
				if ( wldcnt > 18 ) {
					 wldptr[wldcnt] = NULL;
					 BREAK(1)
				}

			ENDLOOP

			wldcnt = 0;
			LOOP					// ファイル名のループ

				if ( wldptr[wldcnt] == NULL ) {
					BREAK(1)
				}

				wldsw = 0;
				wldcnt2 = 0;
				strcpy( ids, dptr );
				LOOP				// 拡張子の分解

					if ( wldsw == 0 ) {
						wldptr2[wldcnt2] = jstrtok( ids, "/|" );
						wldsw = 1;
					}
					else {
						wldptr2[wldcnt2] = jstrtok( NULL, "/|" );
					}

					if ( wldptr2[wldcnt2] == NULL ) {
						BREAK(1)
					}

					wldcnt2++;
					if ( wldcnt2 > 18 ) {
						wldptr2[wldcnt2] = NULL;
						BREAK(1)
					}

				ENDLOOP

				wldcnt2 = 0;
				LOOP				// チェックループ

					if ( wldptr2[wldcnt2] == NULL ) {
						BREAK(1)
					}
				// ファイル名と拡張子より wldchk 用文字列作成
					strcpy( chkstring, wldptr[wldcnt] );
					strcat( chkstring, "." );
					strcat( chkstring, wldptr2[wldcnt2] );

					rtn = chkwld( fname, chkstring );
					if ( rtn == 1 ) {	// 一つでも合致するとOK
						BREAK(3)
					}

					wldcnt2++;

				ENDLOOP

				wldcnt++;

			ENDLOOP

		}

		basecnt++;

	END

	return( rtn );

}




2009.10.31 Saturday | 08:58

  MLOOP.H ふるいむかし

loop 処理をマクロにしたものですが、
もう、良く覚えていません・・・・
利用サンプルを次の記事に貼ります
MLOOP.H 利用サンプル
#define MLOOP \
   { \
   while(1) { \
      static int sw_continue = 0; \
      if ( sw_continue >= 1 ) { \
         sw_continue = 0; \
         break; \
      } \
      if ( sw_continue <= -1 ) { \
         sw_continue = 0; \
         break; \
      } \

#define MLOOPX(p1,p2,p3) \
   { static int loop_dummy; \
   loop_dummy = 0; \
   while(1) { \
      static int sw_continue = 0; \
      if ( loop_dummy == 0 ) { \
         p1; \
         loop_dummy = 1; \
      } \
      else { \
         p3; \
      } \
      if ( sw_continue >= 1 ) { \
         sw_continue = 0; \
         break; \
      } \
      if ( sw_continue <= -1 ) { \
         sw_continue = 0; \
         break; \
      } \
      if ( (p2) == 0 ) { \
         break; \
      }

#define LOOP \
   { \
   while(1) { \
      if ( sw_continue >= 1 ) { \
         sw_continue--; \
         break; \
      } \
      if ( sw_continue <= -1 ) { \
         break; \
      } \

#define LOOPX(p1,p2,p3) \
   { static int loop_dummy; \
   loop_dummy = 0; \
   while(1) { \
      if ( loop_dummy == 0 ) { \
         p1; \
         loop_dummy = 1; \
      } \
      else { \
         p3; \
      } \
      if ( sw_continue >= 1 ) { \
         sw_continue--; \
         break; \
      } \
      if ( sw_continue <= -1 ) { \
         break; \
      } \
      if ( (p2) == 0 ) { \
         break; \
      }

#define CONTINUE(a) \
   sw_continue = -1 * a; \
   continue;

#define BREAK(a) \
   sw_continue = a; \
   continue;

#define END \
   }}

#define ENDMAIN \
   }}

#define ENDLOOP \
   } \
   if ( sw_continue >= 1 ) { \
      continue; \
   } \
   if ( sw_continue <= -1 ) { \
      sw_continue++; \
      continue; \
   }}




2009.10.31 Saturday | 08:52

  Windows 3.1 の頃 ふるいむかし

タイムスタンプ 1996
資料だ資料。
誰かの役に立つかもしれない(笑)
#include "libread.h"

//////////////////////////////////////////////////////////////////////
//  ファイルバイナリチェック
//////////////////////////////////////////////////////////////////////
int
chkfbin( char *fname )
{
	int i;
	FILE *fptr;
	long fsize;
	char work[512];

	fptr = fopen( fname, "rb" );
	if ( fptr != NULL ) {
		fseek( fptr, 0, SEEK_END );
		fsize = ftell( fptr );
		if ( fsize > 512 ) {
			fsize = 512;
		}
		fseek( fptr, 0, SEEK_SET );
		fread( work, 512, 1, fptr );
		fclose( fptr );
	}
	else {
		return( -2 );
	}

	for ( i = 0; i < (int)fsize; i++ ) {
		switch( work[i] ) {
			case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05:
			case 0x06: case 0x07: case 0x08:							  case 0x0b:
			case 0x0c:				case 0x0e: case 0x0f: case 0x10: case 0x11:
			case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
			case 0x19:				case 0x1b: case 0x1c: case 0x1d: case 0x1e:
			case 0x1f:
				return( -1 );
		}
	}
	return( 0 );
	
}




1/1