提问人:Martin Ba 提问时间:2/3/2023 更新时间:2/4/2023 访问量:85
Win32 CopyFile(W) 是否曾经引发 (SEH) 异常?
Does or DID Win32 CopyFile(W) ever raise a (SEH) exception?
问:
BOOL CopyFileW( [in] LPCWSTR lpExistingFileName, [in] LPCWSTR lpNewFileName, [in] BOOL bFailIfExists );
...
如果函数失败,则返回值为零。获取扩展错误 信息,致电.
GetLastError
但是,我在我们的 C++ 源代码中发现了这个宝石,可以追溯到:Oct / 2006
try { //Exception, if the file already exists and is write protected
bCopyOK = CopyFile(csSourceFile, csDestinationFile, bFailIfExists);
} catch (...) {
bCopyOK = FALSE;
}
我什至找到了旧的票证标题(当然没有细节):“如果目标受写保护,函数'CopyFile'会抛出异常,捕获异常”:-)
即使在今天,我们仍然使用 进行编译,因此这会捕获任何引发的 SEH 异常。/EHa
现在,在这个时间点,我们将在 Windows XP 上使用 Visual Studio 6,并且该版本有各种怪癖,但仍然: 我很难想象这个函数会引发异常(除了无效/空参数等)。
答:
Win32 CopyFile(W) 是否曾经引发 (SEH) 异常?
不。
起初根本不存在 SEH 例外。SEH 这是异常处理程序的类型,但不是异常类型。另一种类型的处理程序(不是异常)是 VEH。
异常可以引发,也可以通过调用 RaiseException
/ / 或由 CPU 引发。当然,可以引发 CPU 异常 alwas(在 case 或 for instanse 指向无效内存的情况下),但绝不能调用 - 通过事实和文档。RtlRaiseException
ZwRaiseException
lpExistingFileName
lpNewFileName
CopyFileW
RaiseException
例外,如果文件已存在且受写保护
那么在什么问题呢?创建写保护文件并调用和测试结果。将返回异常或错误代码lpNewFileName
CopyFile
评论
自我回答,有历史的眼光。
没有记录抛出异常,从上面链接的当前文档中可以明显看出。
另一个答案以及例如,DeleteFile() 或 CopyFile() 是否抛出异常? 非常肯定地断言不应该提出任何例外。
但是,正如评论中提到的:
很少有 API 调用被记录在案,以引发 SEH 异常,但这并不意味着它们不会或阻止 SEH 异常在 外来代码通过。
在链接的问题中:
评论:。。。摆脱已安装的反恶意软件产品可以挽救它的一些可能性,ymmv。...
答:那是......企业信息安全系统,反恶意软件等产品。
很有可能原始开发人员实际上可以在他的机器上重现这种行为,并且吞下错误“修复”了它。
从那时起,情况有所改善。鉴于在当前代码中不可能进行复制,并且这仅适用于任何时候,try-catch 是清理的候选者。/EHa
评论
CopyFile
从不引发软件异常(SEH - 这不是执行类型,而是异常处理程序的类型)。如果文件名指向无效的内存位置,则只能是硬件异常。但这不能通过 try/catch(...) 来解决问题,而只能通过 __try/__except 来解决问题。代码片段错误且毫无意义/EHa
编译器标志允许捕获C++异常和结构化异常。catch(...)