com0com虚拟端口未找到。

15

我在一台64位的Windows 7机器上安装了com0com v2.2.2.0,看起来安装成功了。

我这样运行命令实用程序:

command> install PortName=COM9 PortName=COM8
       CNCA0 PortName=COM9
       CNCB0 PortName=COM8
ComDB: COM8 - logged as "in use"
ComDB: COM9 - logged as "in use"

command> busynames COM?*
COM3
COM4
COM5
COM6
COM8
COM9
COMPOSITEBATTERY
注意:被记录为“正在使用中”不是错误信息?
然后我尝试像这样打开COM8。
m_hIDComDev = CreateFileA( szCodedPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
if( m_hIDComDev == NULL  || m_hIDComDev == INVALID_HANDLE_VALUE ) {

    wchar_t * lpMsgBuf;
    DWORD dw = ::GetLastError(); 
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    myErrorMsg = (char*)malloc( 200 );
    sprintf(myErrorMsg,"Error creating connection %s ( %s ) %S",
        szPort,szCodedPort,lpMsgBuf);

这会失败并显示以下错误

Error creating connection COM8 ( COM8 ) The system cannot find the file specified.

我已经尝试过"COM8"和"\\.\COM8"

请注意,在“真实”的COM端口上,完全相同的CreateFileA调用可以正常工作。

Q:有人能告诉我问题出在哪里吗?

A:在Windows 7 64位上,您必须启用未签名驱动程序的测试。

  • 以管理员身份运行命令提示符。(仅以具有管理员权限的账户运行是不足够的。有关如何执行此操作的详细信息,请参见此处。)

  • 输入以下命令:bcdedit -set TESTSIGNING ON

  • 重新启动。(Windows会在桌面右下角放置一个“测试模式”注释)

对于Windows 8,此方法效果不佳或难以使用。 这里讨论了相关问题和解决方法。

或者您可能想尝试签名版本 - 我自己没有尝试过。


1
它显示COM8 - 已登录为"in use" - 这很可能是您的问题。 - Jonathon Reinhart
@Jonathon Reinhart 你熟悉com0com吗?根据文档中的提示,“正在使用”消息仅意味着这些COM端口已被com0com驱动程序分配,因此不会再次分配。如果操作系统认为它们很忙,它会给我一个不同的错误。据我所知! - ravenspoint
1
“正在使用”通常是一个错误消息。开源的好处在于,您可以阅读代码以了解它实际上应该意味着什么。 - Hans Passant
是的,我曾经使用过com0com,但是是用C#访问它。很抱歉我不能提供更多帮助。 - Jonathon Reinhart
@Hans Passant,出现错误的原因是什么? - ravenspoint
为什么你要显式调用 CreateFile 函数的 ANSI 版本?Hans 建议你查看 com0com 项目的源代码,以了解你收到的错误消息的含义。如果像你所说的那样,调用 CreateFile 函数可以在“真实”的 COM 端口上工作,那么问题显然就出在那里。 - Cody Gray
3个回答

19

如果有人在参考并对此话题感兴趣,com0com的2.2.2.0版本已经为64位Windows签名。这消除了将Windows置于“测试”模式的繁琐步骤。


2
3.0.0.0版本在Windows 7 64位系统上无法正常工作。2.2.2.0版本完美运行。 - Zac
1
在SourceForge的3.0.0.0文件夹中没有Changes.txt。有人知道2.2.2.0和3.0.0.0之间有什么变化吗? - DaAwesomeP

9
以下是我的观点:
  • 微软要求64位驱动程序必须被签名
  • com0com.sys(64位)只是一个没有经过签名的内核模式驱动程序。

SoftWx编写了一份有趣的教程,介绍如何在64位Windows 7机器上安装它。您可以从此处获取。


谢谢。这使我朝着正确的方向前进了。诀窍是要从“作为管理员”启动的命令提示符中运行bcdedit。仅以具有管理员特权的帐户运行是不够的。 - ravenspoint
这个解决方案唯一的问题是Windows必须处于测试模式才能使驱动程序工作。一旦重新启动,您将无法再使用它。这个解决方案不是永久性的,我不想一直让我的计算机处于驱动程序测试模式(这会带来安全风险)。 - DaAwesomeP

1

这是一篇非常老的帖子,但如果有人像我一样偶然发现它,我想提供一些帮助。

在 Windows 10 版本 2004 之后,您可能需要在 BIOS 中禁用安全启动。

我从 SourceForge 获得了一个签名版本为 3.0 的应用程序,在我的一台电脑上(Windows 10 Pro 版本 2004),它完美地工作。我只需安装该应用程序,就会立即创建两对链接端口。

在我的笔记本电脑上(Windows 10 Pro 版本 20H2),我没有得到相同的结果。没有创建任何 COM 端口,并且在设备管理器中无法配置设备。更改 BIOS 设置后,我重新安装了应用程序,一切都很顺利。

参考链接:

https://sourceforge.net/projects/com0com/

https://sourceforge.net/projects/signed-drivers/files/com0com/v3.0/

回答@DaAwesomeP(我没有声望将其放在评论中),GitHub上有一个repo https://github.com/paulakg4/com0com,我可以看到一个changes.txt。如果我比较日期,它看起来是相同的3.0版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接