// MineSweeping.cpp:DLL定義された初期化ルーチン。
//
#include "stdafx.hを"
の#include "MineSweeping.h"
_DEBUGの#ifdef
の#define新しいDEBUG_NEW
#endifの
//
// TODO:MFC DLLに対してこのDLLを動的にリンクされている場合、
任意のエクスポート// DLLから転送
// MFC機能マクロAFX_MANAGE_STATEに追加されなければならない
最初の//この関数。
//
//例:
//
//のextern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
//通常の関数本体ここ
//}
//
//これマクロ呼び出しは、任意のMFCの前に
//各機能において非常に重要な表示されます。これは、
それが次の文の最初のエントリでなければなりません//:
//は、でも、すべてのオブジェクト変数を宣言するために、見える
彼らのコンストラクタはMFC生成する可能性があるため、//
// DLLの呼び出しを。
//
//その他の詳細、
// MFCテクニカルノート33および58を参照してください。
//
// CMineSweepingApp
BEGIN_MESSAGE_MAP(CMineSweepingApp、CWinAppの)
END_MESSAGE_MAP()
// CMineSweepingApp建設
:: CMineSweepingApp CMineSweepingApp()
{
// TODO:ここで追加するように構成されたコード、
//のInitInstanceにおける全ての重要な初期化
}
//のみCMineSweepingAppオブジェクト
CMineSweepingApp theApp;
HWND g_Wnd;
WNDPROC g_OldProc;
PDWORD g_pWidth =(PDWORD)0x01005334。
PDWORD g_pHeight =(PDWORD)0x01005338。
PDWORD g_pMineCount =(PDWORD)0x01005330。
PBYTE g_pBase =(PBYTE)0x1005340。
#define MINE 0x8F
// CMineSweepingApp初始化
// MOV ECX、DWORD PTR DS:[0x1005334]
// MOV EDX、DWORD PTR DS:[0x1005338]
// LEA EAX、DWORD PTR DS:[ECX + 0x2の]
// TEST EAX、EAX
// PUSH ESI
// MOV ESI、EDX
// SHL ESI、0x5
// LEA ESI、DWORD PTR DS:[ESI + 0x1005360]
// EAX 12月。
// BYTE MOV PTR DS:[EAX + 0x1005340]、0x10を
// BYTE MOV PTR DS:[EAX + ESI]、0x10を
// JNZ SHORT winmine.01002F03
LRESULT
CALLBACK
のWindowProc(
_In_ HWND hWndは、
_In_ UINTメッセージ、
_In_ WPARAM wParamに、
_In_ LPARAM lParamに)
{
IF(メッセージ== WM_KEYDOWN &&のwParam == VK_F5)
{
のOutputDebugString(L "F5")。
int型* = nWidth g_pWidth。
int型* = nHeight g_pHeight。
int型* = nMineCount g_pMineCount。
CStringのstrString;
strString.Format(L "宽度た:%d、高度た:%d、雷数:%のD"、nWidth、
nHeight、nMineCount)。
OutputDebugString(strString.GetBuffer())。
int型nFindCount = 0;
(; Y <nHeight + 1 Y ++ size_tのY = 1)のために
{
CStringのstrLine変数の値。
(; X <nWidth + 1 X ++ size_tのX = 1)のために
{
BYTE byCode = *(PBYTE)((DWORD)g_pBase + X + Y * 32)。
(byCode == MINE)であれば
{
nFindCount ++。
// byCode = 0x8Eが。
}
他
{
int型XPOS、YPOS。
XPOS =(X << 4) - 4。
YPOS =(Y << 4)+は0x27。
//模拟键盘输入
SendMessage(hWndは、WM_LBUTTONDOWN、0、MAKELPARAM(XPOS、YPOS))。
SendMessage(hWndは、WM_LBUTTONUP、0、MAKELPARAM(XPOS、YPOS))。
}
のCString strCode。
strCode.Format(L "%の02X"、byCode)。
strLine変数の値+ = strCode。
}
のOutputDebugString(strLine.GetBuffer())。
}
のCString strCode。
strCode.Format(L "雷的个数%D"、nFindCount)。
OutputDebugString(strCode.GetBuffer())。
}
そうであれば(MSG == WM_MOUSEMOVE)
{
int型のX、Y。
X = LOWORD(lParamに)。
Y = HIWORD(lParamに)。
= X(X + 4)>> 4;
Y =(Y -は0x27)>> 4;
BYTE * = byCode(PBYTE)((DWORD)g_pBase + X + Y * 32);
IF(byCode == MINE)
{
SetWindowText関数( "雷がある" hWndを、L);
//メッセージボックス(NULL、L "ここレイ注意してください"、NULL、NULL);
}
他
{
SetWindowText関数(hWndを、L "地雷除去");
}
}
(CallWindowProcを返しますg_OldProc、hWndは、メッセージ、wParamに、lParamに);
}
BOOL CMineSweepingApp ::のInitInstance()
{
のCWinApp ::のInitInstance()。
//ウィンドウハンドル得、1ウィンドウを探す
g_Wnd =のFindWindow(L "地雷"、L "地雷除去を");
IF(g_Wnd == NULL)
{
のOutputDebugString(L "ウィンドウハンドル取得失敗");
戻りFALSE;
}
/ 。/ 2ウィンドウは、コールバック設け
g_OldProc =(WNDPROC)のSetWindowLong(g_Wnd、
; GWL_WNDPROC、(LONG)のWindowProc)
IFは(g_OldProc == NULL)
{
のOutputDebugString(L "の設定ウィンドウは、コールバックを失敗");
戻りFALSEを;
}
TRUEを返します。
}