Delphi 由于防病毒,Win32 WriteFile未返回

Delphi 由于防病毒,Win32 WriteFile未返回,delphi,winapi,antivirus,Delphi,Winapi,Antivirus,我的代码是用Delphi7编写的,但我不认为它有什么特殊作用 我试图用WriteFile覆盖文件的内容。 除了在写入“.dll”文件和防病毒处于活动状态时,它工作正常 打开文件的句柄仍然可以 写入被阻止:WriteFile函数不返回 防病毒软件似乎可以防止该dll中的覆盖。 但是,最糟糕的是,我必须重新启动电脑,因为我的应用程序被阻止,任务管理器被阻止,Windows资源管理器被阻止,等等 我怎样才能防止这种情况 有什么想法吗?如果在可执行文件中添加数字签名,则触发反病毒的可能性较小。很多d

我的代码是用Delphi7编写的,但我不认为它有什么特殊作用

我试图用WriteFile覆盖文件的内容。 除了在写入“.dll”文件和防病毒处于活动状态时,它工作正常

  • 打开文件的句柄仍然可以
  • 写入被阻止:WriteFile函数不返回
防病毒软件似乎可以防止该dll中的覆盖。 但是,最糟糕的是,我必须重新启动电脑,因为我的应用程序被阻止,任务管理器被阻止,Windows资源管理器被阻止,等等

我怎样才能防止这种情况


有什么想法吗?

如果在可执行文件中添加数字签名,则触发反病毒的可能性较小。很多delphi程序被反病毒软件误定位,D7是最差的

不确定要写入dll的内容。反病毒软件不喜欢PE之外的额外数据


如果您只需要更新dll,请尝试重命名旧dll,然后编写新文件,然后删除旧文件。

参考其他人关于如何解决防病毒问题的说法,在代码中,您还可以使用重叠I/O在
WriteFile()上设置超时
确保您的代码不再死锁,以防此问题再次出现。如果重叠操作超时,您可以使用
CancelIo()
取消该操作,然后将问题报告给用户。

请注意,还有更多信息。您使用的是什么防病毒软件?抱歉,但我们无法控制最终用户的电脑。Bitdefender出现问题。然后不要执行触发防病毒软件的操作。像安装人员那样做。将新内容写入文件,可能没有dll扩展名。注册一次运行以用新内容替换dll并请求重新启动。任何编译器都不能在带有该AV软件的计算机上运行。我建议换掉AV。如果没有客户,您可能希望联系AV供应商。除非您正在编写编译器,否则您的程序看起来很像恶意软件。@DavidHeffernan:我们在工作中使用BitDefender,它通常不会干扰Delphi。但你是对的,这是迄今为止我见过的最烦人的AV解决方案。一旦当前订阅用完,我们将转向其他内容,这次我不相信德国c't杂志中的AV测试。但是WriteFile会变为异步,不是吗?是的,但这并不意味着您让调用代码也异步运行。您可以使用
file\u FLAG\u OVERLAPPED
标志打开文件,然后声明一个
OVERLAPPED
结构并用
CreateEvent()
中的可等待事件填充它,然后像通常一样调用
WriteFile()
,但将
OVERLAPPED
传递给它,然后使用
WaitForSingleObject()
等待事件发出信号。如果WFSO报告发出信号,请使用
GetOverlappedResult()
获取写入结果,否则使用
CancelIo()
中止写入并根据需要处理WFSO错误/超时。