2016-04-09 10 views
2

dllをゲームプロセスに挿入し、dllで作成するフックを作成して、Windowsイベントを処理する新しいスレッドを作成します。WinAPIでDLLを作成する

スレッド関数:

void CFile::winThread(void *pData) 
{ 
    CFile *pThis = reinterpret_cast<CFile*>(pData); 

    // Common controls init 
    INITCOMMONCONTROLSEX iCC; 
    iCC.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    iCC.dwICC = ICC_BAR_CLASSES; 

    InitCommonControlsEx(&iCC); 

    pThis->m_pConnect = new WinConnect(300, 180); 
    pThis->m_pConnect->setText("Connecting"); 
    pThis->m_pConnect->show(); 

    MSG message; 
    while (GetMessage(&message, 0, 0, 0)) 
    { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 

    tthread::mutex _mutex; 
    _mutex.lock(); 
    pThis->m_bIsFinished = true; 
    _mutex.unlock(); 
} 

WinConnect.cpp

WinConnect::WinConnect(int width, int height) 
{ 
    if (registerWin()) 
    { 
     int screenWidth = GetSystemMetrics(SM_CXSCREEN); 
     int screenHeight = GetSystemMetrics(SM_CYSCREEN); 
     int x = (screenWidth/2) - (width/2); 
     int y = (screenHeight/2) - (height/2); 

     m_hWin = CreateWindowExA(WS_EX_CLIENTEDGE, winNameConnect, "Test Window", 
      WS_POPUP | WS_BORDER | WS_CAPTION, 
      x, y + 200, width, height, NULL, NULL, GetModuleHandle(NULL), NULL); 

     printf("GetLastError %d\n", GetLastError()); 

     if (m_hWin) 
     { 
      RECT size; 
      GetClientRect(m_hWin, &size); 

      int winH = size.bottom - size.top; 
      int winW = size.right - size.left; 
      int buttonW = winW/2; 

      m_hLInfo = CreateWindowEx(0, "STATIC", "", 
      WS_VISIBLE | WS_CHILD | SS_CENTER | SS_CENTERIMAGE, 
      7, 7, winW - 14, winH - 41, m_hWin, NULL, GetModuleHandle(NULL), NULL); 

      printf("GetLastError %d\n", GetLastError()); 

      // 9 pix odstep height 
      m_hBCancel = CreateWindowEx(0, "BUTTON", "Cancel", 
       WS_VISIBLE | WS_CHILD | SS_CENTER, 
       buttonW/2, winH - 30, buttonW, 25, m_hWin, NULL, GetModuleHandle(NULL), NULL); 

      printf("GetLastError %d\n", GetLastError()); 
     }  
    } 
} 

bool WinConnect::registerWin() 
{ 
    WNDCLASSEX winClass; 

    winClass.hInstance = GetModuleHandle(NULL); 
    winClass.lpszClassName = winNameConnect; 
    winClass.lpfnWndProc = wndProc; 
    winClass.style = CS_DBLCLKS; 
    winClass.cbSize = sizeof(WNDCLASSEX); 
    winClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    winClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
    winClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    winClass.lpszMenuName = NULL; 
    winClass.cbClsExtra = 0; 
    winClass.cbWndExtra = 0; 
    winClass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; 

    if (!RegisterClassEx(&winClass)) 
     return false; 

    return true; 
} 

のGetLastErrorの出力は、次のとおり

のGetLastError 0

のGetLastError 127

のGetLastError 127

このラベルとボタンが作成されていない理由を私は理解することはできません。常にウィンドウが作成され、問題が発生します。どんな助け?

+0

壊れたエラー処理がありますwinapi関数が失敗したときに初めてGetLastError()を呼び出すだけです。 –

+0

'GetLastError'は最後のエラーを返します。有用な値を返すために 'GetLastError'が実際にはエラーがあります。特定の関数がエラーをどのように示しているかは、関数によって異なります。 – Neil

+0

だから、どのようなアイデア、どのように私は本当の理由を確認できますか? –

答えて

0

まず、コメントに記載されているように、GetLastErrorの結果は、前の関数が実際に失敗しない限り意味がありません。だから、m_hLInfo == NULLかどうかを最初に確認しなければならないでしょう。

実際の問題について:あなたのコードは、Windows APIのUnicodeバージョンを使用していますが、ANSI文字列を入力しているようです。

ウィンドウが正しく作成されるのは、関数のANSIバージョンであるCreateWindowExA(通知A)を明示的に呼び出すためです。ボタンとラベルについては、CreateWindowExと呼ばれ、ヘッダファイルのファイルは#defineとなります。CreateWindowExW、つまりUnicodeバージョンです。しかし、あなたのクラス名("STATIC""BUTTON")はUnicodeではありません! (だから、Windowsはもちろん、恐ろしく失敗します文字化けのクラス名とウィンドウを作成しようとします。)

だから、あなたはどこにでもCreateWindowExACreateWindowExを変更、または可能性のいずれか - よりよい - どこでも適切なUnicode文字列を使用します。CreateWindowExAからAを削除し、先頭に追加WinAPIのすべての文字列はLとなります。 L"BUTTON"。 (または、あなたは常にあなたがマクロ_Tを使用することができ、Unicodeのコンパイラ環境にあると確信していない場合、例えば_T("BUTTON")。)

さらに読書:
Wikibooks article
MSDN article

+0

ANSIにプロジェクトがセットアップされています。 –

関連する問題