C++ Windows API SendMessage+;WM_SETTEXT导致崩溃
我在SendMessageA(句柄,WM_SETTEXT,0,(LPARAM)文本)方面遇到问题;如果在构造函数以外的任何地方使用,则会导致崩溃。 MWC.hC++ Windows API SendMessage+;WM_SETTEXT导致崩溃,c++,winapi,crash,sendmessage,C++,Winapi,Crash,Sendmessage,我在SendMessageA(句柄,WM_SETTEXT,0,(LPARAM)文本)方面遇到问题;如果在构造函数以外的任何地方使用,则会导致崩溃。 MWC.h #include <Windows.h> #include <iostream> #include <string> class MWC{ private: MSG msg; public: MWC(); ~MWC(); int mLoop(); int mCl
#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);
};
};
};
Main.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;
}
#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;
}
事情是。。sendmessage在(MWC.cpp)下工作正常:
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;
}
但在此处使用会导致崩溃:
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;
}
顺便说一句,我只是一个业余爱好者,在玩winapi:)。请随意评论您碰巧发现的任何bug 您的对话过程看起来完全错误。每次对话框过程运行时,您都试图发送WM_SETTEXT!这可能建立了一个无限递归,可能还有其他各种各样的问题 您的
SendMessage
调用绝对正常,只是无法在每次运行对话框过程时都进行调用
我不明白
IsChanged()
函数是关于什么的。您的框架设计非常奇怪。我建议您先看看其他一些框架(例如ATL),了解如何围绕Win32编写框架。或者,更好的方法是使用现有的框架。您的“文本”是否以null结尾?您遗漏了重要的部分:如何调用文本
方法?我认为终止符不重要,我尝试添加它,但它不断崩溃。我建议您将代码库修剪到再现崩溃所需的绝对最小值,并在此处发布结果。@Raymond main.cpp第13行:textbox1.Text(“测试”);哦,天哪,我无意中在BOOL-WINAPI-myProc而不是WinMain中添加了函数调用,非常感谢david!