【问题标题】:CallWindowProc() generates error 5 (Access is denied)CallWindowProc() 生成错误 5(访问被拒绝)
【发布时间】: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


【解决方案1】:

GetLastError() 返回最后发生的错误(它甚至在名称中这么说!)。

所以最后发生的错误是“访问被拒绝”。

什么时候发生的?没有线索。它应该发生吗?不知道。这是个问题吗?可能不是。拒绝访问某物的原因有很多,也许 Windows 操作系统的某些部分只是想查看是否它可以访问某物。

您应该调用GetLastError当您收到错误并且文档告诉您调用它以获取错误代码时。否则你只会得到最后发生的错误,这可能是程序的一个完全不同的部分,也许是 supposed 是错误的地方。你正在编造虚构的问题,但实际上根本不存在。

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2013-06-06
    • 2011-03-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多