DELPHI/TComport с UAC/uiAccess только не в состоянии читать / записывать на устройство с TComPort2010
У меня есть настольное приложение Delphi, которое использует TComport2010 для связи через USB/COM. Это приложение, считывает координаты X,Y с USB-устройства и тыкает на рабочий стол Windows, имитируя мышь. Все работает нормально, кроме случаев, когда пытаются переместить окно OSK(на экранной клавиатуре), эта проблема исправлена в приложении, работающем с правами администратора или uiAccess = true
в манифесте см. обсуждение здесь: проблема доступа к OSK. Следуя решению, предложенному в посте выше, я могу указывать события мыши в OSK. Но TComport2010 не может записать в comport при запуске приложения со следующим манифестом, который имеет только запрос uiAccess = true
и не права суперпользователя.
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="true"/>
</requestedPrivileges>
Приложение скомпилировано с предложенным манифестом, подписано и запущено в директории программного файла, но в этой ситуации компортирование не выполняется, запись невозможна... если я запускаю приложение с контекстным меню, запускаемым от имени администратора, то все работает нормально, OSK высовывает и ком-порт для чтения / записи. Приложению нужны какие-то права для доступа к COM-устройствам? Или может быть связано с доступом к реестру TComport? Полный манифест здесь:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="pendrv.exe"
version="2.0.0.2552"
processorArchitecture="*" />
<description>Fixed Up App</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--This Id value indicates the application supports Windows 7 functionality-->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--This Id value indicates the application supports Windows 8 functionality-->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--This Id value indicates the application supports Windows 8.1 functionality-->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<applicationRequestMinimum>
<PermissionSet ID="FullTrust" Unrestricted="true" />
<defaultAssemblyRequest permissionSetReference="FullTrust" />
</applicationRequestMinimum>
<requestedPrivileges>
<!-- this access OSK but tcomport fails -->
<requestedExecutionLevel level="asInvoker" uiAccess="true"/>
<!-- in this case all works fine, but popup superuser request, that I want to avoid -->
<requestedExecutionLevel level="requireAdministrator" uiAccess="true"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Проблема в том, что TcomPort не работает с манифестом, использующим только uiAccess = true
, как это:
<requestedExecutionLevel level="asInvoker" uiAccess="true"/>
Я запустил приложение с подписью и в папке программных файлов.
Неудачный код delhpi - это вызов writestr в comport, который завершается неудачно при запуске приложения с asinvoker и uiaccess=true, при запуске с правами администратора он работает, если я помещаю приложение без манифеста и каких-либо прав в одну и ту же папку. ком работа тоже работает. Соответствующий код Delphi выглядит следующим образом:
Компонент com не возвращает никакого сообщения, отправленного устройством, я уверен, что устройство отправляет сообщение каждые 30 секунд, но событие onrxchar никогда не возникает, вызывается функция записи, но не уверен, действительно ли сообщение MSG отправлено на устройство. В общем, кажется, что Windows блокирует связь между устройством и компонентом delphi при работе с asinvoker и uiaccess=true. Если я запускаю с правами администратора, тот же код работает отлично.
Я поместил код tcomport на pastebin, потому что здесь есть ограничения по размеру, ссылка на код:
После того, как я поместил несколько сообщений журнала в мемо-поле, я прослеживаю нормальный цикл событий TComport, когда получаю некоторые данные от внешнего USB-устройства.
Это цикл нормальной операции чтения / получения данных: (работает как администратор)
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
...
Вот цикл, когда я запускаю приложение только с уровнем uiAccess=true и asInvoker в одной и той же папке программных файлов Windows:
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
Журнал останавливается на ReadStr, кажется, что thread.execute зависает или что-то, может быть, по неизвестной причине приложение не получает USB-события от Windows..