C++ WM_CTLCOLORSTATIC";“访问被拒绝”;,C++;WINAPI
你好,C++ WM_CTLCOLORSTATIC";“访问被拒绝”;,C++;WINAPI,c++,winapi,system-error,C++,Winapi,System Error,你好, 我使用ResEdit创建了一个无模式对话框,以精确模拟默认Windows“Paint”应用程序中的窗口颜色选择对话框的功能。 我做这是我的C++ WiAPI研究的一部分。 (见下图:) 我目前遇到的问题是,在“WM_CTLCOLORSTATIC”处理过程中,我似乎无法为“PictureBox”控件的背景着色。我不知道为什么,但是,当我试图处理WM_CTLCOLORSTATIC时,我收到系统错误消息“访问被拒绝” 我的代码如下所示: DWORD dwLastError; TCHAR
我使用ResEdit创建了一个无模式对话框,以精确模拟默认Windows“Paint”应用程序中的窗口颜色选择对话框的功能。
我做这是我的C++ WiAPI研究的一部分。 (见下图:) 我目前遇到的问题是,在“WM_CTLCOLORSTATIC”处理过程中,我似乎无法为“PictureBox”控件的背景着色。我不知道为什么,但是,当我试图处理WM_CTLCOLORSTATIC时,我收到系统错误消息“访问被拒绝” 我的代码如下所示:
DWORD dwLastError;
TCHAR lpBuffer[256];
switch(msg)
{
[...]
case WM_CTLCOLORSTATIC:
if(dwLastError != 0) // Don't want to see a "operation done successfully" error ;-)
::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, // It´s a system error
NULL, // No string to be formatted needed
dwLastError, // Hey Windows: Please explain this error!
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), // Do it in the standard language
lpBuffer, // Put the message here
lpBuffer -1, // Number of bytes to store the message
NULL);
[...]
}
甚至没有任何“在WM_CTLCOLORSTATIC的情况下”,我得到了系统错误“访问被拒绝”的响应
我不知道这是什么原因。以下是错误:
lpBuffer -1,
将其更改为
sizeof(lpBuffer)/sizeof(TCHAR)-1
我们希望看到的不是FormatMessage的(坏)处理,而是您在WM\u CTLCOLORSTATIC
中使用的实际代码错误检查代码看起来是假的,因此获得垃圾错误消息并不奇怪。GetLastError()仅在winapi函数返回失败状态后立即使用时才有效。通常为假返回或空指针。没有任何迹象表明您将此代码放在了正确的位置。GDI函数不设置最后一个错误。FormatMessage()调用也是错误的,第二个问题。顺便说一下,您应该将变量lpBuffer
的名称更改为justbuffer
。Microsoft使用前缀lp
表示指针类型的变量,但缓冲区是静态大小的数组,而不是指针。。。