Windows 带有UAC/uiAccess的DELPHI/TComport仅在使用TComPort2010读取/写入设备时失败

Windows 带有UAC/uiAccess的DELPHI/TComport仅在使用TComPort2010读取/写入设备时失败,windows,delphi,uac,tcomport,Windows,Delphi,Uac,Tcomport,我有一个Delphi桌面应用程序,它使用TComport2010执行USB/COM通信。这个应用程序,从USB设备读取坐标X,Y,并在windows桌面上模拟鼠标。除尝试移动OSK窗口(在屏幕键盘上)外,所有操作都正常,此问题在应用程序以管理员权限运行或清单上的uiAccess=true时得到修复,请参阅此处的讨论: 按照上面帖子建议的解决方案,我可以在OSK上戳鼠标事件。 但是,当使用以下清单运行应用程序时,TComport2010无法在comport上写入,该清单仅具有请求uiAccess=

我有一个Delphi桌面应用程序,它使用TComport2010执行USB/COM通信。这个应用程序,从USB设备读取坐标X,Y,并在windows桌面上模拟鼠标。除尝试移动OSK窗口(在屏幕键盘上)外,所有操作都正常,此问题在应用程序以管理员权限运行或清单上的
uiAccess=true
时得到修复,请参阅此处的讨论: 按照上面帖子建议的解决方案,我可以在OSK上戳鼠标事件。 但是,当使用以下清单运行应用程序时,TComport2010无法在comport上写入,该清单仅具有请求
uiAccess=true
,而没有超级用户权限

<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="true"/>
</requestedPrivileges>
我正在运行的应用程序已签名并位于program files文件夹中

失败的delhpi代码是调用comport上的writestr,当使用asinvoker和uiaccess=true运行应用程序时失败,当使用管理员权限运行时它工作,如果我将没有清单和任何权限的应用程序放在同一文件夹中,所有com作业也工作。相关的delphi代码如下所示:

com组件不会发送设备发送的任何消息,我确定设备每30秒发送一次消息,但onrxchar事件从不出现,会调用write函数,但不确定消息是否真的发送到设备。一般来说,当运行asinvoker和uiaccess=true时,windows似乎会阻止设备和delphi组件之间的通信。如果我使用管理员权限运行,同样的代码可以完美地工作

我将tcomport的代码放在pastebin上,因为这里有大小限制,代码的链接是:

在将一些日志消息写入memo字段后,我跟踪从外部usb设备接收数据时导入事件的正常循环

这是正常读取/接收数据操作的周期:(以管理员身份运行)

TCOMLOG:----CreateHandle正常-----
TCOMLOG:_writestrawapper:=9
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:dotpempty
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar调用
TCOMLOG:ReadStr已调用
TCOMLOG:ReadAsync已调用
TCOMLOG:ReadAsync已通过
TCOMLOG:ReadStr已完成
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar调用
TCOMLOG:ReadStr已调用
TCOMLOG:ReadAsync已调用
TCOMLOG:ReadAsync已通过
TCOMLOG:ReadStr已完成
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar调用
TCOMLOG:ReadStr已调用
TCOMLOG:ReadAsync已调用
TCOMLOG:ReadAsync已通过
TCOMLOG:ReadStr已完成
TCOMLOG:Thread.execute
...
以下是我在windows的同一program files文件夹中仅以uiAccess=true和asInvoker级别运行应用程序的周期:

TCOMLOG:-----CreateHandle OK-----
TCOMLOG:_WriteStrWrapper:<read_ch>=9
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:DoTxEmpty
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar call
TCOMLOG:ReadStr called
TCOMLOG:ReadAsync called
TCOMLOG:ReadAsync passed
TCOMLOG:ReadStr 
TCOMLOG:----CreateHandle正常-----
TCOMLOG:_writestrawapper:=9
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:dotpempty
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar调用
TCOMLOG:ReadStr已调用
TCOMLOG:ReadAsync已调用
TCOMLOG:ReadAsync已通过
TCOMLOG:ReadStr

日志在ReadStr上停止,似乎是thread.execute freeze或其他原因,可能是因为应用程序不接收来自windows的usb事件。

访问COM端口不需要任何特权。这可能是您在代码中所做的事情,也可能是TComPort所做的事情,它阻止了
asInvoker
,并提高了对管理员级别的要求。导入如何失败?错误消息?如果您还没有调试应用程序,则需要调试应用程序以查找发生故障的行。嗯,AfterConnect上的事件会引发,onrxchar上的事件也会引发,但是当尝试在com上进行writestr时,它会失败,不引发任何异常,我将代码放在try/exception中。。。使用清单中的此设置,我无法调试。请编辑您的问题,以包括导致任何异常的代码。同时发布相关代码,
刚刚失败
。我重复我的问题:你看到了什么异常/错误?写作怎么会失败?。如果你请求帮助,你需要详细说明这些事情。我不明白你为什么先添加一些代码,然后再删除它?无论如何,我看到您记录了一些错误情况。日志是否写入磁盘?特别是你的程序所在的同一个目录?代码的大小比post允许的要大,我现在通过粘贴库共享代码。
<requestedExecutionLevel level="asInvoker" uiAccess="true"/>
TCOMLOG:-----CreateHandle OK-----
TCOMLOG:_WriteStrWrapper:<read_ch>=9
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:DoTxEmpty
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar call
TCOMLOG:ReadStr called
TCOMLOG:ReadAsync called
TCOMLOG:ReadAsync passed
TCOMLOG:ReadStr finished
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar call
TCOMLOG:ReadStr called
TCOMLOG:ReadAsync called
TCOMLOG:ReadAsync passed
TCOMLOG:ReadStr finished
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar call
TCOMLOG:ReadStr called
TCOMLOG:ReadAsync called
TCOMLOG:ReadAsync passed
TCOMLOG:ReadStr finished
TCOMLOG:Thread.execute
...
TCOMLOG:-----CreateHandle OK-----
TCOMLOG:_WriteStrWrapper:<read_ch>=9
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:DoTxEmpty
TCOMLOG:Thread.execute
TCOMLOG:Thread.DispathComMsg
TCOMLOG:Thread.DoEvents
TCOMLOG:CallRxChar
TCOMLOG:DoRxChar call
TCOMLOG:ReadStr called
TCOMLOG:ReadAsync called
TCOMLOG:ReadAsync passed
TCOMLOG:ReadStr