CreateFile() 返回 INVALID_HANDLE_VALUE 但 GetLastError() 为 ERROR_SUCCESS

2023-12-30

我正在使用打开串行端口创建文件() http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx。我有一个测试用例(太复杂而无法重新分发),它始终导致CreateFile()回来INVALID_HANDLE_VALUE and GetLastError()回来ERROR_SUCCESS。从表面上看,只有当一个线程在另一个端口关闭该端口的同一时间打开该端口时,才会出现此错误。打开端口的线程遇到了这个问题。

我不知道这是否有什么不同,但稍后在代码中我使用将端口与 CompletionPort 关联起来创建IoCompletePort http://msdn.microsoft.com/en-us/library/windows/desktop/aa363862%28v=vs.85%29.aspx.

这是我的代码:

HANDLE port = CreateFile(L"\\\\.\\COM1",
                         GENERIC_READ | GENERIC_WRITE,
                         0,                    // must be opened with exclusive-access
                         0,                    // default security attributes
                         OPEN_EXISTING,        // must use OPEN_EXISTING
                         FILE_FLAG_OVERLAPPED, // overlapped I/O
                         0);                   // hTemplate must be NULL for comm devices
if (port == INVALID_HANDLE_VALUE)
{
    DWORD errorCode = GetLastError();
    cerr << L"CreateFile() failed with error: " << errorCode << endl;
}

我很确定这种事情不应该发生。我做错了什么吗?如何让 API 返回正确的结果?


更多细节:此代码取自我开发的串行端口库:J外设 http://code.google.com/p/jperipheral/

这是实际的(未经净化的)源代码:

JLong SerialChannel::nativeOpen(String name)
{
    cerr << "nativeOpen(" << name << ")" << endl;
    wstring nameWstring = name;
    HANDLE port = CreateFile((L"\\\\.\\" + nameWstring).c_str(),
        GENERIC_READ | GENERIC_WRITE,
        0,                                          // must be opened with exclusive-access
        0,                                          // default security attributes
        OPEN_EXISTING,                  // must use OPEN_EXISTING
        FILE_FLAG_OVERLAPPED,       // overlapped I/O
        0);                                         // hTemplate must be NULL for comm devices
    cerr << "nativeOpen.afterCreateFile(" << name << ")" << endl;
    cerr << "port: " << port << ", errorCode: " << GetLastError() << endl;
    if (port == INVALID_HANDLE_VALUE)
    {
        DWORD errorCode = GetLastError();

        switch (errorCode)
        {
            case ERROR_FILE_NOT_FOUND:
                throw PeripheralNotFoundException(jace::java_new<PeripheralNotFoundException>(name, Throwable()));
            case ERROR_ACCESS_DENIED:
            case ERROR_SHARING_VIOLATION:
                throw PeripheralInUseException(jace::java_new<PeripheralInUseException>(name, Throwable()));
            default:
            {
                throw IOException(jace::java_new<IOException>(L"CreateFile() failed with error: " +
                    getErrorMessage(GetLastError())));
            }
        }
    }

    // Associate the file handle with the existing completion port
    HANDLE completionPort = CreateIoCompletionPort(port, ::jperipheral::worker->completionPort, Task::COMPLETION, 0);
    if (completionPort==0)
    {
        throw AssertionError(jace::java_new<AssertionError>(L"CreateIoCompletionPort() failed with error: " +
            getErrorMessage(GetLastError())));
    }
    cerr << "nativeOpen.afterCompletionPort(" << name << ")" << endl;

    // Bind the native serial port to Java serial port
    SerialPortContext* result = new SerialPortContext(port);
    cerr << "nativeOpen.afterContext(" << name << ")" << endl;
    return reinterpret_cast<intptr_t>(result);
}

这是我得到的实际输出:

nativeOpen(COM1)
nativeOpen.afterCreateFile(COM1)
port: 00000374, errorCode: 0
nativeOpen.afterCompletionPort(COM1)
nativeOpen.afterContext(COM1)
[...]
nativeOpen(COM1)
nativeOpen.afterCreateFile(COM1)
port: FFFFFFFF, errorCode: 0
java.io.IOException: CreateFile() failed with error: The operation completed successfully.

 HANDLE port = CreateFile(...);
 cerr << "nativeOpen.afterCreateFile(" << name << ")" << endl;
 cerr << "port: " << port << ", errorCode: " << GetLastError() << endl;
 if (port == INVALID_HANDLE_VALUE)
 {
    DWORD errorCode = GetLastError();

cerr 的输出会在后台调用 winapi 调用。这将重置 GetLastError() 返回的线程错误值。使固定:

 HANDLE port = CreateFile(...);
 int err = GetLastError();
 // etc, use err instead...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CreateFile() 返回 INVALID_HANDLE_VALUE 但 GetLastError() 为 ERROR_SUCCESS 的相关文章

  • 计算串行通信的块校验字符 (BCC)

    我通过 NET 的 SerialPort 类通过串行与设备进行通信 并且根据第三方设备规范要求 我需要计算 块检查字符 我被告知的唯一信息是 这是一个异或运算 XOR 并且必须对所有角色执行 那么 如果我有字符串 Bob 001 将如何计算
  • 为什么我无法在 Android 上从串口打开/写入?

    我编写了一个 Android 应用程序 它在 Android 4 4 Kitkat 设备上的自定义内核上运行 该设备使用 Android 串行端口 API https code google com p android serialport
  • 在 C++\Win32 中编辑控件文本更改消息

    与 NET for C Win32 中的 TextChanged 属性匹配的消息是什么 假设你正在谈论编辑控件 http msdn microsoft com en us library bb775458 VS 85 aspx EN CHA
  • 以编程方式或使用清单 (MinGW) 将“覆盖高 DPI 缩放”设置为“系统(增强)”

    我尝试了所有可能的组合gdiScaling and dpiAware 仍然没有运气 如果我手动右键单击 app exe 并将 覆盖高 DPI 缩放 设置为 系统 增强 效果很好
  • 如何检测Windows 8.1开始菜单?

    当我们在 Windows 8 1 上按下开始菜单时 它会以磁贴的形式显示所有新的开始菜单以及应用程序 该菜单显示在整个屏幕上 有没有办法检测这个菜单是否在 C 中打开 8 1 SDK 中是否有 winAPI 可以执行此操作 提前致谢 调用
  • 读取进程的进程内存不会返回所有内容

    我正在尝试扫描第三方应用程序的内存 我已经查到地址了 现在是在0x0643FB78 问题是 从那以后我就再也爬不上去LPMODULEENTRY32 gt modBaseAddr is 0x00400000 and LPMODULEENTRY
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • 如何获取当前所选键盘布局的显示名称

    我需要以语言栏显示输入语言的方式向用户显示输入语言列表 例如 目前我有 class Program static void Main string args var langs InputLanguage InstalledInputLan
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 如何用C语言测量时间?

    我想知道某个代码块执行了多长时间 大约 像这样的事情 startStopwatch do some calculations stopStopwatch printf lf timeMesuredInSeconds How 您可以使用clo
  • 在 C++ 程序中多次使用 FindWindows?

    我使用以下代码 C 来获取窗口 另一个应用程序 的句柄并向其中一个按钮发送消息以模拟单击 并且它可以正常工作 BOOL CALLBACK EnumChildProc HWND hwnd LPARAM lParam mdv test list
  • WritePrivateProfileString 未在末尾添加属性

    我正在使用以下命令在 ini 文件中写入一些属性WritePrivateProfileString函数并且一切正常 但是当我添加多行文本时 出现了问题 这是代码和输出 WritePrivateProfileString T General
  • Win32 API:如何读取序列号,或者如果不是数据则在超时内退出

    我需要一个函数来从串行端口读取数据 或者如果在时间间隔内没有数据则返回 例如 在 GNU Linux 上你可以使用poll orselect read Windows 中有类似的东西吗 下面是我尝试过的 它应该可以工作 但是功能获取重叠结果
  • 如何在没有清单的情况下启用视觉样式

    根据docs http msdn microsoft com en us library bb773187 aspx 如果您希望应用程序使用 ComCtl32 dll 版本 6 则必须添加应用程序清单或编译器指令指定应使用版本 6 如果可用
  • ListView 多选行为?

    Comtl32 dll v6 0中的ListView进行多项选择 使用Shift键时 如下 x表示选择 00xxxx xxxxxx xxxx00 早期版本的 ListView 的做法如下 00xx00 00xx00 00xx00 有没有办法
  • 如何取消同步 WinHttp 请求?

    我的服务有一个线程可能正在执行WinHttpSendRequest当有人试图停止我的服务时 The WinHttpCloseHandle 文档 http msdn microsoft com en us library windows de
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • 如何捕获正在播放的音频?

    有谁知道如何以编程方式捕获正在播放的声音 即来自声卡的所有声音 而不是麦克风等输入设备 假设您正在谈论 Windows 则基本上可以通过三种方法来实现此目的 首先是打开音频设备的主输出作为录音源 这只有在驱动程序支持时才可能实现 尽管现在大
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目

随机推荐

  • Haskell:应用多态函数两次

    我们可以有一个多态函数f a gt b为不同的对实施a and b 我们怎样才能使 twice a gt b gt a gt c twice f x f f x 类型检查 即我怎样才能编写一个应用a的函数多态性功能两次 With Rank2
  • Android Studio 4.2.1 jarsigner 现在在哪里?

    我正在使用 Android Studio 的嵌入式 JDK C Program Files Android Android Studio jre 并且我正在使用jarsigner其中 jre bin jarsigner exe 按照描述签署
  • 应使用哪个提供程序来实现 Java Persistence API (JPA) [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想为我的 Web 应用程序使用 Java Persistence API JPA 有流行的 JPA 实现 例如休眠 Toplink and E
  • 如何删除docker0接口

    我想删除 docker0 接口 启动服务时最好避免创建接口docker0 直接使用eth0 要删除接口 请使用 ip link delete docker0 您可能需要sudo特权
  • 如何返回 ASP.NET MVC 视图中的当前操作?

    我想在我的母版页中设置一个 CSS 类 它取决于当前的控制器和操作 我可以通过以下方式访问当前控制器ViewContext Controller GetType Name 但是我如何获得当前的操作 例如Index Show etc 在 RC
  • 如何设置 Popover 视图以正确关闭

    经过一番工作后 我得到了一个弹出视图 其中显示了一个自定义 uiview 显示正确 当您点击弹出窗口视图之外时 它会按预期关闭 但是我也希望它在点击其中的按钮时关闭 有谁可以帮助我吗 努力寻找简明指南 要手动关闭弹出窗口 您需要保留对它的引
  • 如何将 Membership Provider 与 Angular.js 和 ASP.Net MVC 4 结合使用?

    我对 Angular js 非常陌生 我想使用 Angular JS 和 ASP Net MVC4 创建一个新项目 我真的很困惑如何将 Angular JS 与 MVC 4 成员资格提供程序一起使用来执行用户身份验证和授权 我可以查看一些示
  • 类型错误:意外的关键字参数传递给优化器:learning_rate

    我正在尝试加载在 Azure VM 上训练的 Keras 模型 NC 促销版 但我收到以下错误 类型错误 意外的关键字参数传递给优化器 learning rate EDIT 这是我用来加载模型的代码片段 from keras models
  • 使用RAD清理工作空间环境的方法(基于Eclipse)

    启动 RAD7 时出现很多错误 服务器不响应类更改 有时服务器无法启动 有时 RAD 不会确认我添加到服务器的模块 这是一种越野车 我知道工作区中有元数据 是否有安全的方法来清理元数据或 RAD 其中 RAD Rational Applic
  • 检查 Elixir 中的 URL 是否有效

    我想检查给定的 URL 是否有效 最好是该 url 也能解析 首先 我将如何检查字符串有效性 即正则表达式 其次 有没有办法可以查看 URL 是否确实解析为互联网上的资源 Thanks 我不会使用正则表达式 而是使用 URI 包以文本方式验
  • 在 JSF 中使用复合组件在视图中重复组件 ID

    我在公司 继承 了一个 JSF 2 JSF 2 2 7 应用程序 并面临 java lang IllegalStateException 因为两个组件似乎具有相同的 ID 视图的结构如下 我提取了相关代码用于说明目的 它可能包含一些拼写错误
  • 仅当不通过 XCode 运行时,iOS 才会崩溃。巧合?

    我的应用程序仅在不使用 XCode 调试器运行时才会崩溃 很难跟踪 因为我无法调试 但我终于弄清楚了 这是因为对一些不属于我的对象调用了release 在我更正之前 我在这里搜索并发现了 2 个相关问题 链接如下 iOS 应用程序在设备上单
  • git 上有用于重置后的钩子吗?

    我有一些所有开发人员都必须更改的本地文件 我将文件标记为 假设未更改 但这并不能阻止它们在重置时发生更改 git 上是否有一个在 git 重置后执行的钩子 如果没有 有人对如何处理这种情况有建议吗 您可以找到以下列表Git 挂钩在这里 ht
  • 如何在 VC++ 中重新启动我自己的应用程序

    正在开发 VC 应用程序 弄清楚如何重新启动我自己的应用程序 有人可以举一些例子吗 编写一个程序 它将 等待您的应用程序终止 再次运行它 调用该程序 然后退出您的应用程序 该解决方案应用相当广泛 另外一个选择 使用特定参数调用您的应用程序
  • 使用分页集合时的 ​​Angularjs 承诺链

    我正在使用一个 REST api 它为 GET 请求提供分页响应 如下所示 count 43103 previous null next http ecoengine berkeley edu api photos page 2 resul
  • Android Studio 和 Gradle,@NotNull 参数的参数 0

    我正在尝试在 Android Studio 中使用 Gradle 制作一个应用程序 但我收到的只是以下错误消息 java lang IllegalArgumentException Argument 0 for NotNull parame
  • 将 Pandas 列表列拆分为多列

    我有一个带有一列的 Pandas DataFrame import pandas as pd df pd DataFrame teams SF NYG for in range 7 teams 0 SF NYG 1 SF NYG 2 SF
  • 多键字典,其中键顺序无关紧要

    我正在尝试创建一个以两个字符串作为键的字典 并且我希望键按任何顺序排列 myDict A B something myDict B A something else print myDict A B 我希望这段代码可以打印 其他内容 不幸的
  • 如何使用VisualVM获取每个函数花费的时间[重复]

    这个问题在这里已经有答案了 VisualVM 对我来说是一个很好但有点复杂的工具 我编写了一个具有许多功能的类 在 Eclipse 中 如何获取每个函数调用的次数以及执行过程中所花费的时间信息 其实很简单 运行您的程序 它将自动在 Visu
  • CreateFile() 返回 INVALID_HANDLE_VALUE 但 GetLastError() 为 ERROR_SUCCESS

    我正在使用打开串行端口创建文件 http msdn microsoft com en us library windows desktop aa363858 28v vs 85 29 aspx 我有一个测试用例 太复杂而无法重新分发 它始终