SQLの窓

2009年10月31日


【絶滅危惧】WINAPI+C : マウスの移動単位って【ミッキー】というんですね

【xp で動作確認しました(vs2008) つまりデータから勝手に絵を描かせられるのです】


マウスの動作のエミュレーションしようと思って、以前使ったSendInput 関数 の
詳細の裏を取りに行ったら、この処理の詳細はこの前の古い関数のところに
説明があるのです。

mouse_event 関数

で、この関数の座標の説明に「ミッキー」が出現します

ちょっと笑ってしまいましたが、処理するのにミッキーの設定をピクセルにしたいので
調べてみるとありました( 検証はまだです )
SDK32:第 2 モニタでの mouse_event と絶対座標移動

相当古い資料なので本当に今動くのかどうか解りませんが、これからチェックします
int  oldAccel[3], newAccel[3], oldSpeed, newSpeed, x, y;
BOOL bResult;

// 以下の値でマウスの移動量を 1 ミッキー/ピクセルに設定する
newAccel[0] = 0;
newAccel[1] = 0;
newAccel[2] = 0;
newSpeed = 1;

// 現在のマウス加速度定数を保存する
bResult = SystemParametersInfo(SPI_GETMOUSE, 0, oldAccel, 0);
bResult = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &oldSpeed, 0);

// マウス加速度定数(無効)を設定する
bResult = SystemParametersInfo(SPI_SETMOUSE, 0, newAccel,
					 SPIF_SENDCHANGE);
bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, &newSpeed,
					 SPIF_SENDCHANGE);

//任意の x, y 座標を設定する
x = -100;
y = -150;

mouse_event(MOUSEEVENTF_ABSOLUTE, 0, 0, 0, 0);

// 標準モニタの左上(原点)にカーソルを移動する
mouse_event(0, x, y, 0, 0);
// カーソルを要求された座標に移動する

// 保存したマウス加速度定数を戻す
bResult = SystemParametersInfo(SPI_SETMOUSE,0, oldAccel,
					 SPIF_SENDCHANGE);
bResult = SystemParametersInfo(SPI_SETMOUSESPEED, 0, &oldSpeed,
					 SPIF_SENDCHANGE);

当然、mouse_event は、SendInput に変更する必要ありますが、
いかにも絶滅危惧らしい情報のなりたちです
あ、そうそう。構造体を見たい場合も一苦労です。
INPUT Structure ()


posted by lightbox at 2009-10-31 19:05 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅危惧】C言語 : PostMessageのフック

内部では自前のクラスを使っていますが、フックそのものとはあまり関係無いので。

フックするには、登録する必要がありますし、DLL である必要があります
全体のソースコードはこちらになります
SendMessage と PostMessage のフック

実際にログを取るアプリケーションを作ってちゃんと動いてました。
主に、Windowsアプリケーションのメニューに対するメッセージをハックするのに使っていました。
( SQLの窓に同梱しています )
// *********************************************************
// 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 );

}



タグ:C言語 Hook DLL
posted by lightbox at 2009-10-31 15:19 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅コード】インラインアセンブラ : PC98 のグラフ LIO

LIO は絶滅しています。当時、真っ黒な画面にこいつらでカラーのポップアップウインドウを表示したりしてました。ソースコードのタイムスタンプでさえ 1993 年 です。

直線を引く
/***********************************************************/
/***    LIO版 直線、短形の描画                       ***/
/***********************************************************/
/***        項目名                   引き数名            ***/
/***    描画始点の座標               x1,y1               ***/
/***    描画終点の座標               x2,y2               ***/
/***    パレット番号                 paret               ***/
/***    描画コード(B,BF)       byoga               ***/
/***    ラインスタイルスイッチ       lswitch             ***/
/***    ラインスタイルすいっちLo   lstairu             ***/
/***    ラインスタイルすいっちHi   hstairu             ***/
/***********************************************************/
#include <memory.h>

static unsigned char *param;
static unsigned int  paramoff;
static unsigned int  ucwseg;
extern unsigned int  lioucw;

extern
void
gline( int x1, int y1, int x2, int y2, int paret, int byoga, int lswitch, int lstairu, int hstairu)
{

   unsigned long work;
   unsigned char sts;

   ucwseg = lioucw;
   work = (unsigned long)lioucw * 256L * 256L;
   work = work + 5120;
   param = (char *)work;
   
   memcpy( param  , (char *)&x1 , 2 );
   memcpy( param+2, (char *)&y1 , 2 );
   memcpy( param+4, (char *)&x2 , 2 );
   memcpy( param+6, (char *)&y2 , 2 );
   (*(param+8)) = (unsigned char)paret;
   (*(param+9)) = (unsigned char)byoga;
   (*(param+10)) = (unsigned char)lswitch;
   (*(param+11)) = (unsigned char)lstairu;
   (*(param+12)) = (unsigned char)hstairu;

	_asm {
		push	ds
		push	es
		push	ss
		push	bx
		push	cx
		push	dx
		push	bp
		push	sp
		push	si
		push	di

		mov	ax,WORD PTR ucwseg
		mov	ds,ax
		mov	bx,5120
		int	0a7h

		pop	di
		pop	si
		pop	sp
		pop	bp
		pop	dx
		pop	cx
		pop	bx
		pop	ss
		pop	es
		pop	ds
		mov	BYTE PTR sts,ah
	}

}



posted by lightbox at 2009-10-31 15:06 | 記録 | このブログの読者になる | 更新情報をチェックする

【絶滅コード】インラインアセンブラ : PC98 の int21

殆ど博物館入りというか、C 言語そのものが絶滅危惧種のような気もします。
PC98 そのものは完全に絶滅してしまっていて、役に立ちませんが、
インラインアセンブラは方法論としては十分活躍するフィールドがあると思います。
元々得意でもなんでもなかったので、簡単な命令しか使って無いので誰かの
役に立つかもしれません
locate
static char err[28]="function locate param error";

extern
void
locate( int x, int y )
{
	char wstring[10];
	int i;

	if ( x<1 || x>80 || y<1 || y>25 ) {
		for ( i = 0; i < 27; i++ ) {
			_asm {
		mov	si,i
		mov	ah,06h
		mov	dl,err[si]
		int	21h
			}
		}

		_asm {
		mov	ah,0ch
		mov	al,08h
		int	21h
		mov	ah,0ch
		mov	al,00h
		int	21h
		}
		return;
	}

	wstring[0] = 0x1b;
	wstring[1] = '[';
	wstring[2] = (char)(y/10+'0');
	wstring[3] = (char)(y%10+'0');
	wstring[4] = ';';
	wstring[5] = (char)(x/10+'0');
	wstring[6] = (char)(x%10+'0');
	wstring[7] = 'H';
	wstring[8] = 0x00;

	for ( i = 0; i < 8; i++ ) {
		_asm {
		mov	si,i
		mov	ah,06h
		mov	dl,wstring[si]
		int	21h
		}
	}

}


posted by lightbox at 2009-10-31 14:59 | 記録 | このブログの読者になる | 更新情報をチェックする

2009年10月27日


VBS : SQLServerよりExcel へエクスポート(Excel製品は必要ありません)

Microsoft.Jet.OLEDB.4.0の利用
要は Microsoft 中心に考えると、たいていの DB に動的に接続して、テーブルを参照できるという事です。( ODBC ドライバ依存 )

Oracle は、常に、スキーマで修飾が必要ですが、他の DB ならテーブル名のみで参照できると思います。

結合もできるところが凄いというか、Microsoft 中心というか結構使い道が広い方法です。

ADOX は、他にも機能もありますが、ADO でたいてい事足りるので、MDB を作成したい場合にのみ利用します。

ADO は、MDB も Excel も 製品をインストールしていなくても DB として使うのならば何も問題無くアクセス可能です。つまり、Access や Excel をインストールしていなくても、ADO 経由でデータを見る事ができます
Set Cn = CreateObject( "ADODB.Connection" )
Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )

' **************************************
' 実行中ディレクトリの取得
' **************************************
strPath = Wscript.ScriptFullName 
Set objFile = Fso.GetFile( strPath )
strCur = Fso.GetParentFolderName( objFile )

on error resume next
Fso.DeleteFile(strCur&"\DUMMY.mdb")
on error goto 0

Set ac = CreateObject("ADOX.Catalog")

' **************************************
' 接続用 MDB 作成
' **************************************
on error resume next
ac.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source="&strCur&"\DUMMY.mdb"&";"
if Err.Number <> 0 then
	Wscript.echo Err.Description
	Wscript.quit
end if
on error goto 0

' **************************************
' 作成したMDB の開放
' **************************************
on error resume next
Set ac = Nothing
on error goto 0

' **************************************
' 接続文字列( ADOX と同じ )
' **************************************
ConnectionString = _
	"Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source=" & strCur&"\DUMMY.mdb" & ";"

' **************************************
' 接続
' **************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **************************************
' エクスポート用 SQL / {SQL Server} は
' {SQL Native Client}に変更可
' **************************************
Query = _
"select * " & _
" into [Excel 8.0;DATABASE="&strCur&"\商品マスタ.xls"&"].[商品マスタ] " & _
" from [ODBC;Driver={SQL Server};" & _
"SERVER=.\SQLEXPRESS;Database=lightbox;UID=sa;PWD=password].[商品マスタ]"

' **************************************
' 実行
' **************************************
Cn.Execute Query

' **************************************
' MDB 開放
' **************************************
Cn.Close
Set Cn = Nothing

' **************************************
' 接続用 MDB 削除
' **************************************
on error resume next
Fso.DeleteFile(strCur&"\DUMMY.mdb")
on error goto 0

Wscript.echo "処理が終了しました   " 




posted by lightbox at 2009-10-27 16:59 | SQLExpress | このブログの読者になる | 更新情報をチェックする

SQLServer のドキュメント

ドキュメントダウンロード
オンラインでも見れますが Microsoft のサイトはサクサクは無理です。
ローカルの PC にインストールしたほうが良いです。

SQL Server 2005 Books Online


オンライン参照
それでも、自分が使う PC 全てにインストールするわけにもいかない
ので、オンラインで見れるようにする事も重要です。

1) Transact-SQL リファレンス
2) コマンド プロンプト ユーティリティ
3) システム ストアド プロシージャ (Transact-SQL)
  ● sp_helpdb (Transact-SQL)


関連する記事
SQL-DMO CSV入出力
bcp.exe を使用した CSV 入出力
xp_cmdshell でストアードプロシージャを知る
SQLの窓1.5(改)でTransact-SQLを学ぶ







posted by lightbox at 2009-10-27 08:43 | SQLExpress | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり