2011-09-12 20 views
3

SendMessageA(ハンドル、WM_SETTEXT、0、(LPARAM)テキスト)に問題があります。コンストラクタ以外の場所で使用されると、クラッシュします。Windows API SendMessage + WM_SETTEXTの結果がクラッシュする

MWC.h

#include <Windows.h> 
#include <iostream> 
#include <string> 

class MWC{ 
private: 
    MSG msg; 
public: 
    MWC(); 
    ~MWC(); 
    int mLoop(); 
    int mClose(UINT); 
    class System{ 
    public: 
     System(){ } 
     ~System(){ } 
     class Form{ 
     public: 
      HWND handle; // Need to access it in order to create other controls 
      Form(char*,int,int,int,int); 
      Form(char*,int,int); 
      ~Form(){ } 
      bool Show(); 
      HWND ReturnHandle(); 
     }; 
     class TextBox{ 
     protected: 
      HWND handle; 
     private: 
      int ID; 
     public: 
      TextBox(char* text,int width,int height,int x,int y,int id,Form* p); 
      TextBox(int width,int height,int x,int y,int id,Form* p); 
      ~TextBox(){ } 
      bool IsChanged(UINT,WPARAM); 
      bool Text(char *); 
      int GetId(){ return ID; } 
     }; 

     class messageBox{ 
     public: 
      messageBox(){ }; 
      ~messageBox(){ }; 
      bool Show(LPCWSTR,LPCWSTR,UINT); 
      bool ShowA(char*,char*,UINT); 
      bool ShowA(std::string,std::string,UINT); 
     }; 
    }; 
}; 

MWC.cpp

#include "MWC.h" 

MWC::MWC(){ } 
MWC::~MWC(){ } 
int MWC::mLoop(){ 
    while(GetMessage(&msg,NULL,0,0)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return 1; 
} 
int MWC::mClose(UINT _msg){ 
    if(_msg == WM_CLOSE){PostQuitMessage(0);return 1;} 
    return 0; 
} 
MWC::System::Form::Form(char* Title,int width,int height,int x,int y){ 
    handle = CreateWindowEx(0,WC_DIALOG,Title,WS_OVERLAPPEDWINDOW | WS_VISIBLE,x,y,width,height,NULL,NULL,NULL,NULL); 
} 
MWC::System::Form::Form(char* Title,int width,int height){ 
    handle = CreateWindowEx(0,WC_DIALOG,Title,WS_OVERLAPPEDWINDOW | WS_VISIBLE,400,100,width,height,NULL,NULL,NULL,NULL); 
} 

bool MWC::System::Form::Show(){ 
    return false; 
} 

HWND MWC::System::Form::ReturnHandle(){ 
    return handle; 
} 

MWC::System::TextBox::TextBox(char* text,int width,int height,int x,int y,int id,Form* p){ 
    ID = id; 
    handle = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",text,WS_VISIBLE | WS_CHILD,x,y,width,height,p->handle,(HMENU)id,NULL,NULL); 
} 
MWC::System::TextBox::TextBox(int width,int height,int x,int y,int id,Form* p){ 
    ID = id; 
    handle = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_VISIBLE | WS_CHILD,x,y,width,height,p->handle,(HMENU)id,NULL,NULL); 
    SendMessageA(handle,WM_SETTEXT,0,(LPARAM)"It works here!"); 
} 
bool MWC::System::TextBox::IsChanged(UINT message, WPARAM wParam){ 
    if(message==WM_COMMAND && HIWORD(wParam)==EN_CHANGE && LOWORD(wParam)==ID){ 
     return true; 
    } 
    return false; 
} 

bool MWC::System::TextBox::Text(char* text){ 
    if(handle == NULL){ 
     return 0; 
    } 
    else{ 
     //SendMessageA(handle,WM_SETTEXT,0,(LPARAM)text); // It doesn't work here! 
     return 1; 
    } 
    return 1; 
} 


bool MWC::System::messageBox::Show(LPCWSTR text,LPCWSTR caption,UINT id){ 
    ::MessageBoxW(NULL,text,caption,id); 
    return true; 
} 

bool MWC::System::messageBox::ShowA(char* text,char* caption,UINT id){ 
    ::MessageBoxA(NULL,(LPCSTR)text,(LPCSTR)caption,id); 
    return true; 
} 

bool MWC::System::messageBox::ShowA(std::string text,std::string caption,UINT id){ 
    ::MessageBoxA(NULL,(LPCSTR)text.c_str(),(LPCSTR)caption.c_str(),id); 
    return true; 
} 

MAIN.CPP

#include "MWC.h" 

MWC mwc = MWC(); 
MWC::System::messageBox mbox = MWC::System::messageBox(); 
MWC::System::Form form1 = MWC::System::Form("Window",600,600); 
MWC::System::TextBox textbox1 = MWC::System::TextBox(600,500,0,0,156,&form1); 

BOOL WINAPI myProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    mwc.mClose(message);  

    //check if text in textbox has been changed by user 
    textbox1.Text("Test"); 
    if(textbox1.IsChanged(message,wParam) == true){ 

    } 
    return false; 
} 





int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
    SetWindowLong(form1.ReturnHandle(), DWL_DLGPROC, (long)myProc); // to be added in the class 
    mwc.mLoop(); 
    return 0; 
} 

MWC::System::TextBox::TextBox(int width,int height,int x,int y,int id,Form* p){ 
    ID = id; 
    handle = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_VISIBLE | WS_CHILD,x,y,width,height,p->handle,(HMENU)id,NULL,NULL); 
    SendMessageA(handle,WM_SETTEXT,0,(LPARAM)"It works here!"); // TESTING 
} 

しかし、ここで使用した場合、それはクラッシュに結果:

bool MWC::System::TextBox::Text(char* text){ 
    if(handle == NULL){ 
     return 0; 
    } 
    else{ 
     //SendMessageA(handle,WM_SETTEXT,0,(LPARAM)text); // It doesn't work here! 
     return 1; 
    } 
    return 0; 
} 

ところで私は素人だ事はのSendMessageが(MWC.cpp)で正常に動作します。..ですwhapでうんざりしています:)。見つけたバグにコメントしてください!

+0

あなたの 'text'はnullで終了していますか? – Indy9000

+0

あなたは重要な部分を省いています:どのように 'Text'メソッドを呼び出していますか? –

+0

ターミネーターは問題ではないと思いますが、私はそれを追加しようとしましたが、クラッシュしています。 – Christian

答えて

3

あなたのダイアログプロシージャはすべて間違っています。ダイアログプロシージャが実行されるたびにWM_SETTEXTを送信しようとしています!おそらく、無限の再帰とおそらくあらゆる種類の他の問題を設定します。

あなたのSendMessageコールは絶対に問題ありません。ダイアログプロシージャを実行するたびに作成することはできません。

IsChanged()の機能がすべてわかりません。あなたのフレームワークの設計は非常に奇妙です。まず、Win32のフレームワークを書く方法についていくつかのアイデアを得るために、他のフレームワーク(例:ATL)を見てみることをお勧めします。または、既存のフレームワークを使用するだけです。

+0

ああ、私は誤ってWinMainではなくBOOL WINAPI myProcで関数呼び出しを追加しました。ありがとうございました。 – Christian

関連する問題