Winapi 为什么这个程序有时崩溃,有时不崩溃?

Winapi 为什么这个程序有时崩溃,有时不崩溃?,winapi,sendmessage,Winapi,Sendmessage,以下程序关闭监视器。当我运行它时,它有时会崩溃,有时不会。反汇编只指向一个随机位置,如0x00011000,没有实际信息 如果我重新编译程序并运行它,重新编译的版本在测试时运行良好。但是下次我真的需要使用它时,它又崩溃了,我需要重新编译它。。。首先让我后悔做了这件事 我不知道如何始终如一地重现错误。(也就是说,除了在我最需要它的时候运行它并看着它崩溃之外。) 是什么导致了该程序中的随机崩溃? #包括 #包括 int WINAPI_tWinMain(HINSTANCE,HINSTANCE,LPTS

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

如果我重新编译程序并运行它,重新编译的版本在测试时运行良好。但是下次我真的需要使用它时,它又崩溃了,我需要重新编译它。。。首先让我后悔做了这件事

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

是什么导致了该程序中的随机崩溃?
#包括
#包括
int WINAPI_tWinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
{
返回发送消息(HWND_广播,WM_系统命令,SC_监视器电源,2);
}
我正在使用Windows7x64,并将其编译为32位程序。我相信我用64位做了同样的尝试,得到了同样的结果,尽管我不是100%确定


编辑1:
  • 如果有人真的复制了这个,请发表评论,让我知道,我很好奇其他人是否可以复制这个

  • 我目前正在测试一个稍微精简的版本(不依赖于C运行时):

    #包括
    #pragma注释(链接器“/NoDefaultLib”)
    #pragma注释(链接器,“/Entry:mainCRTStartup”)
    #pragma注释(链接器“/Subsystem:Windows”)
    int mainCRTStartup()
    {
    返回SendMessageW(HWND_广播,WM_系统命令,SC_监视器电源,2);
    }
    /*
    此程序的Base64版本,如果您想使用它:
    TvqqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDXAABOEGEAGJ//wAA/XUAEAAAA99GBWPFYW8ZMUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==
    */
    
    目前,这个版本的作品。。。但是,当我重新编译它时,上一个也是如此。如果这个没有崩溃,我会把它贴在这里

  • 如果你想重现这一点,我的建议是:编译程序,让它浸泡一两天当你使用电脑一段时间后,试着运行程序几次。。。当我尝试这样做时,通常会出现错误,直到我重新编译程序


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

对不起,各位


编辑3: 好的。。。事实上,每当您需要复制错误时,您不能:|


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

配置病毒扫描程序,使其不受应用程序的干扰


您的应用程序太靠近,无法忽略此处的病毒扫描程序。

也许您已经看到了这一点,但其要点是不建议以这种方式使用HWND_广播。我在一个不应命名的网站上发现了这个via,大意是您在这里使用的示例代码虽然很流行,但并不是处理监视器断电的正确方法


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

这是唯一有意义的事情。如果您重新编译它,那么它可以工作的说法是有什么东西正在散列exe并以某种方式干扰它。百分之九十九是病毒扫描器,但你说你没有

  • 您构建了exe。它的哈希值为0x1234
  • 你来管理它。病毒扫描程序对其进行哈希运算,允许其运行,然后确定它正在执行它不喜欢的操作(例如向所有窗口广播关机消息)
  • 你再运行一次。病毒扫描程序说:“看,0x1234又启动了;我要给它打补丁,阻止它广播关机消息,或者干脆停止它运行。”
  • 您可以重新生成exe。它有一个新的散列0x4321(散列仅因为它有一个新的创建/修改日期而改变)
  • 回到2

  • +那真是一团糟。你究竟是怎么偶然发现这种宝石的?@Mikola:为什么,我当然用了科学的方法!这不是所有的发现都是这样产生的吗?!您是否可以尝试将return SendMessage更改为仅返回0,以及它前面的行上的SendMessage…环境还有什么不同
    #include <Windows.h>
    #include <tchar.h>
    
    int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
    {
        return SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
    }
    
    #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==
    */