Я пытаюсь вызвать командную строку для копирования текстового файла в порт в скомпилированном OCX, написанном на VB6. Он делает это с помощью команды копирования в командной строке, отправляет текстовый файл в порт типа «LPT1» и т. Д. Это отлично работает на XP и 7, но Windows 8 не позволит ему произойти. Я принял следующие шаги:Уязвимость Windows 8 на VB6 Shell Call
- сделать услугу с помощью этого OCX работать под учетной записью конкретного администратора вместо учетной записи локальной системы
- Использование «ShellExecute» в коде VB6, обеспечивая, чтобы использовать правильный синтаксис , (Это отлично работает в Windows 7, но снова не работает в Windows 8)
- Сделайте исполняемый файл из пакетного файла, который содержит манифест администратора, но не содержит кости.
- Я удостоверился, чтобы зарегистрировать OCX в качестве администратора каждый раз, когда
Благодаря команда работает как на Windows XP и 7, я склонен полагать, что это проблема разрешения с Windows 8 , но все обходные пути до сих пор не удались. Если требуется дополнительная информация, пожалуйста, сообщите мне, и я предоставлю ее. Благодаря!
Edit: Я обнаружил, что OCX ведет себя должным образом при отладке ... Я думаю, что отладка OCX предоставляет его привилегии, которые IDE имеет, что Visual Studio 6.
Редактировать : В соответствии с запросом, вот оригинальный код ShellAndWait, написанный на VB6, который используется для запуска консоли cmd.
Public Function ShellAndWait(ByVal FilePath As String, ByVal eAppStyle As VbAppWinStyle) As Boolean
Dim lPID As Long
'Default to not found'
m_lShellHandle = 0
'run the program'
lPID = Shell(FilePath, eAppStyle)
' Check for errors'
If lPID = 0 Then
ShellAndWait = False
Exit Function
End If
'The command console window is tough to get a hold of, so'
'that's the reason there are two attempts before moving on'
'and the delays, allow time for window to start'
DoEvents
Sleep 500
'Find the window handle'
EnumWindows AddressOf FindThread, lPID
'Not found - Try finding again (more aggressive wait)'
If m_lShellHandle = 0 Then
Sleep (1000)
EnumWindows AddressOf FindThread, lPID
End If
'Make sure we have a valid window'
If m_lShellHandle <> 0 Then
'Keep checking to see if window is still available'
Do While IsWindow(m_lShellHandle)
'Allow repaint'
DoEvents
'Allow other processes to run'
SleepEx 300, True
Loop
End If
ShellAndWait = True
End Function
Скажите, пожалуйста, что именно вы имеете в виду: «скопировать текстовый файл в порт»? –
Было ли изменение в Windows 8 изменением с 32 до 64 бит? Если это так, вероятно, он сломал все функции Declare в вашем OCX. (64 бит требует объявлений PtrSafe). – Comintern
Томас, вы можете использовать команду «Копировать» из командной строки следующим образом: скопировать «TextFileNamehere.txt» «PrinterPort», чтобы распечатать текстовый файл прямо в порт. Прошу прощения, я бы так сказал. Коминтерн, я понимаю, что вы имеете в виду.Я тоже подумал об этом, но подтвердил, что после запуска отладчика в OCX он повысил его до тех же прав, что и VB6 в Windows 8, и смог вызвать команду. Я не уверен, почему это гарантировало отрицательный рейтинг 2, но до тех пор, пока я могу получить некоторые подсказки, я крут с любым рейтингом;) – Mritter26