【发布时间】:2021-02-03 05:17:51
【问题描述】:
我正在尝试解决在执行CallWindowProc 期间遇到GetLastError() 的错误。代码如下:
static LRESULT CALLBACK editSubProc(HWND h, UINT m, WPARAM w, LPARAM l)
{
//some implementation
//GetLastError() returns 0 here
CallWindowProc(edit_proc,h,m,w,l);
}
窗口的创建如下所示:
HWND ch=CreateWindowEx(style,"Edit","",dwstyle,l,t,r-l,b-t,hwnd,0,hInst,0);
edit_proc=(WNDPROC)GetWindowLongPtr(ch,GWLP_WNDPROC);
SetWindowLongPtr(ch,GWLP_WNDPROC,(LONG_PTR)editSubProc);
现在的情况是,主循环调用IsDialogMessage(...),它调用editSubProc,它通过CallWindowProc,再次调用editSubProc。在 editSubProc 的第二次调用开始时,GetLastError 返回 5。
一切都是从同一个线程调用的。这种行为的原因可能是什么?
【问题讨论】:
-
这个 api 没有设置最后一个错误并且没有意义调用
GetLastError这里 -
这意味着某些功能被“拒绝访问”。哪个功能?谁在乎?它可以是整个程序或 Windows 操作系统中的任何功能。这是相当无用的信息。
-
如果我错了,请纠正我,但是由于在执行
CallWindowProc之前错误是0,并且执行之后/期间错误是5,这意味着它被设置了。 -
就目前而言,您的代码看起来无法编译。您的
editSubProc返回什么值?如果它返回错误的值,它可能会被永远递归调用。也许改用return CallWindowProc(edit_proc,h,m,w,l);? -
GetLastError()的结果仅在调用记录设置它的函数后立即有意义,然后(通常)仅当该函数通过其他方式报告一般错误时才有意义,例如返回值。在所有其他情况下,您无法从中看出任何东西。
标签: c++ windows winapi error-handling