2015-04-13 1 views
-1

Я пытаюсь вызвать командную строку для копирования текстового файла в порт в скомпилированном 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 
+1

Скажите, пожалуйста, что именно вы имеете в виду: «скопировать текстовый файл в порт»? –

+0

Было ли изменение в Windows 8 изменением с 32 до 64 бит? Если это так, вероятно, он сломал все функции Declare в вашем OCX. (64 бит требует объявлений PtrSafe). – Comintern

+0

Томас, вы можете использовать команду «Копировать» из командной строки следующим образом: скопировать «TextFileNamehere.txt» «PrinterPort», чтобы распечатать текстовый файл прямо в порт. Прошу прощения, я бы так сказал. Коминтерн, я понимаю, что вы имеете в виду.Я тоже подумал об этом, но подтвердил, что после запуска отладчика в OCX он повысил его до тех же прав, что и VB6 в Windows 8, и смог вызвать команду. Я не уверен, почему это гарантировало отрицательный рейтинг 2, но до тех пор, пока я могу получить некоторые подсказки, я крут с любым рейтингом;) – Mritter26

ответ

0

Код, который вы отправили, дает ответ, и проблема заключается в вызове EnumWindows. VB6 не имеет 64 битный компилятор доступен, и любой VB6 приложение будет декларировании EnumWindows функционировать аналогично:

Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As _ 
Long, ByVal lParam As Long) As Long 

Проблема в том, что первый аргумент функции указатель для обратного вызова, и Лонг 32-битный адрес памяти, а оператор AddressOf будет возвращать только 32 бита адреса обратного вызова. Насколько я знаю, нет реального способа объявить функцию API для приема 64-битного указателя в VB6. Фактически, как упоминалось выше в комментариях, 64-битный Office требовал расширения для среды выполнения VBA, чтобы разрешить использование типов LongPtr и объявлений PtrSafe для вызовов API, которые были безопасны на 64 бита. Дополнительную информацию об этом вы найдете в вопросе 'Can a VB6 component be compiled to 64 bit?' и Office Dev Center page for PtrSafe.

Скорее всего, он работает нормально в контексте отладчика, потому что он работает внутри среды WOW, но будет работать, если вызван из другого контекста, потому что он попытается начать работу в контексте, отличном от WOW.

Хотя есть может быть некоторыми обходными решениями, это потребует исчерпания подавляющего большинства вызовов API. Как говорится в комментарии, «окно командной консоли трудно удержать, поэтому ...», скорее всего, будет проще переносить это на .NET.

+0

Спасибо за этот очень подробный и информативный ответ. Несмотря на этот вопрос, отрицательный рейтинг сеттинга, я чему-то научился и ценю ваше время и силы! Большое спасибо. – Mritter26

Смежные вопросы