gpt4 book ai didi

winapi - 为什么这个程序有时会崩溃,有时不会?

转载 作者:行者123 更新时间:2023-12-04 15:47:56 26 4
gpt4 key购买 nike

以下程序关闭显示器。当我运行它时,它有时会崩溃,有时不会。反汇编只是指向一个随机位置,如 0x00011000 ,并且没有真实信息。

如果我重新编译程序并运行它,重新编译的版本在我测试它时运行良好。但是下次我真的需要使用它,它再次崩溃,我需要重新编译它......让我后悔当初这样做。

我不知道如何始终如一地重现错误。 (也就是说,除了在我最需要它的时候运行它并看着它崩溃。)

什么可能导致该程序随机崩溃?

#include <Windows.h>
#include <tchar.h>

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
return SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}

我正在使用 Windows 7 x64,并将其编译为 32 位程序。我相信我已经用 64 位尝试过同样的事情并得到了相同的结果,尽管我不是 100% 确定。

编辑1:
  • 如果有人真的复制了这个,请发表评论并让我知道,我很好奇其他人是否可以复制这个。
  • 我目前正在测试一个稍微精简的版本(不依赖于 C 运行时):
    #include <Windows.h>
    #pragma comment(linker, "/NoDefaultLib")
    #pragma comment(linker, "/Entry:mainCRTStartup")
    #pragma comment(linker, "/Subsystem:Windows")

    int mainCRTStartup()
    {
    return SendMessageW(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
    }

    /*
    Base64 version of this program, in case you want to use it:
    TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAABkN3fRfGzjEXxs4xF8bOMhv7ujEbxs4xF8bKMRPGzjIb+0IxE8bOMhv7pjETxs4xSaWNoRfGzjAAAAAAAAAAAUEUAAEwBAQBYIgROAAAAAAAAAADgAA8BCwEHCgACAAAAAAAAAAAAAAgQAAAAEAAAACAAAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAIAAAAAIAAAAAAAACAAAEAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAAAoEAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAHQAAAAAEAAAAAIAAAACAAAAAAAAAAAAAAAAAAAgAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYEAAAAAAAAGoCaHDxAABoEgEAAGj//wAA/xUAEEAA99gbwPfYw8zMUBAAAAAAAAAAAAAAaBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgQAAAAAAAAQgJTZW5kTWVzc2FnZVcAAFVTRVIzMi5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
    */

    目前,这个版本有效……但话又说回来,当我重新编译它时,前一个版本也有效。如果事实证明这个没有崩溃,我会在这里发布。
  • 如果你想重现这个,我的建议是:编译程序,让它腌一两天。 :) 当您使用计算机一段时间后,请尝试运行该程序几次...当我尝试这样做时,通常会出现错误,直到我重新编译该程序为止。


  • 编辑2:

    出于某种原因,每当你想向人们展示一个问题时,它就会神奇地得到解决。同上这里的情况。我会继续尝试重现错误,但目前,它似乎工作正常。 :\(我怀疑这可能是因为安装了 Windows 7 SP1,但我真的很怀疑......如果我发现我会在这里发布。)

    对不起大家...

    编辑3:

    好吧...碰巧,每当您需要重现错误时,您都不能。 :|

    但是,至少我发现了其他东西:似乎将消息发送到的正确窗口是 GetShellWindow() 返回的窗口。 .希望这对其他人有用。

    最佳答案

    也许你已经看过这个,但 this article by Windows god Raymond Chen 的要点是不推荐以这种方式使用 HWND_BROADCAST。我是通过 comments 找到的在一个不得命名的站点上,大意是您在这里使用的示例代码虽然很流行,但并不是处理显示器断电的正确方法。

    这并不能解释为什么您看到的正是您所看到的,但它确实提供了一些证据表明所讨论的代码是可疑的。

    关于winapi - 为什么这个程序有时会崩溃,有时不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6463421/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com