CreateFile() 在 Windows XP 中工作,但在 Windows 7 中失败,返回句柄无效

Posted

技术标签:

【中文标题】CreateFile() 在 Windows XP 中工作,但在 Windows 7 中失败,返回句柄无效【英文标题】:CreateFile() Works in Windows XP but fails in Windows 7 return Handle Invalid 【发布时间】:2016-04-05 11:16:17 【问题描述】:

尝试使用 CreateFile() 创建处理程序时,即使以管理员身份执行应用程序,我也会收到以下错误消息:“系统找不到指定的文件。 (来自 HRESULT 的异常:0x80070002)“:没有。”

这是用于此任务的代码示例:

Private Enum EFileAccess As System.Int32
        GENERIC_WRITE = &H40000000
End Enum

Friend Enum EFileShare        
    FILE_SHARE_READ = &H1
    FILE_SHARE_WRITE = &H2
End Enum

Friend Enum ECreationDisposition        
    OPEN_EXISTING = 3
End Enum

Friend Enum EFileAttributes
   FILE_FLAG_NO_BUFFERING = &H20000000
End Enum

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function CreateFile(ByVal lpFileName As String, _
                                ByVal dwDesiredAccess As EFileAccess, _
                                ByVal dwShareMode As EFileShare, _
                                ByVal lpSecurityAttributes As IntPtr, _
                                ByVal dwCreationDisposition As ECreationDisposition, _
                                ByVal dwFlagsAndAttributes As EFileAttributes, _
                                ByVal hTemplateFile As IntPtr) As Microsoft.Win32.SafeHandles.SafeFileHandle
    End Function

路径指向 Windows Server 2003 中的矩阵打印机。

handle = CreateFile(\\brbhzpc001154\Epson_2180,
                                EFileAccess.GENERIC_WRITE,
                                EFileShare.FILE_SHARE_READ Or EFileShare.FILE_SHARE_WRITE,
                                IntPtr.Zero,
                                ECreationDisposition.OPEN_EXISTING,
                                EFileAttributes.FILE_FLAG_NO_BUFFERING,
                                IntPtr.Zero)

此应用程序在 Windows XP 中编译时可以正常运行,但在 Windows 7 中尝试执行时,总是会出现上述错误。

【问题讨论】:

您可能需要以“管理员身份”运行 "...即使以管理员身份执行应用程序,..." 【参考方案1】:

有解决方案here 建议在 Win7 上将 OPEN_EXISTING 更改为 OPEN_ALWAYS 将使其在 Win7 上工作,但没有解释原因。

【讨论】:

以上是关于CreateFile() 在 Windows XP 中工作,但在 Windows 7 中失败,返回句柄无效的主要内容,如果未能解决你的问题,请参考以下文章

如何使 CreateFile 尽可能快

windows编程中的CreateFile 出现5的错误解决方法

windows编程中的CreateFile 出现5的错误解决方法

Windows下createfile函数用GENERIC_READ访问模式打不开磁盘

使用Windows API配置串行端口:CreateFile失败,错误2(ERROR_FILE_NOT_FOUND)

readwriteasciifile是啥代码文件