Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB6外壳程序调用的Windows 8权限破坏_Windows_Shell_Permissions_Vb6_Windows 8.1 - Fatal编程技术网

VB6外壳程序调用的Windows 8权限破坏

VB6外壳程序调用的Windows 8权限破坏,windows,shell,permissions,vb6,windows-8.1,Windows,Shell,Permissions,Vb6,Windows 8.1,我试图调用命令提示符将文本文件复制到用VB6编写的已编译OCX中的端口。它是通过命令提示符中的copy命令来实现的,它将文本文件发送到“LPT1”等端口。这在XP和7上非常有效,但Windows 8不允许这种情况发生。我已经采取了以下步骤: 使使用此OCX的服务在特定管理员帐户而不是本地系统帐户下运行 在VB6代码中使用“ShellExecute”,确保使用正确的语法。(这在Windows 7上正常工作,但在Windows 8中再次失败) 从包含管理员清单但没有骰子的批处理文件中生成可执行文件

我试图调用命令提示符将文本文件复制到用VB6编写的已编译OCX中的端口。它是通过命令提示符中的copy命令来实现的,它将文本文件发送到“LPT1”等端口。这在XP和7上非常有效,但Windows 8不允许这种情况发生。我已经采取了以下步骤:

  • 使使用此OCX的服务在特定管理员帐户而不是本地系统帐户下运行
  • 在VB6代码中使用“ShellExecute”,确保使用正确的语法。(这在Windows 7上正常工作,但在Windows 8中再次失败)
  • 从包含管理员清单但没有骰子的批处理文件中生成可执行文件
  • 我确保每次都将OCX注册为管理员
由于该命令同时适用于Windows XP和7,我倾向于认为这是Windows 8的权限问题,但到目前为止所有的解决方法都失败了。如果需要更多的信息,请让我知道,我会提供它。谢谢

编辑:我发现OCX在调试时表现正常。。。我猜OCX的调试授予它IDE所拥有的特权,即VisualStudio6

编辑:根据要求,以下是用VB6编写的用于启动cmd控制台的原始ShellAndWait代码

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
Public函数ShellAndWait(ByVal FilePath作为字符串,ByVal eAppStyle作为VbAppWinStyle)作为布尔值
暗lPID与长lPID相同
“默认为未找到”
m_lShellHandle=0
“运行程序”
lPID=Shell(文件路径,eAppStyle)
“检查错误”
如果lPID=0,则
ShellAndWait=False
退出功能
如果结束
“命令控制台窗口很难掌握,所以”
“这就是在继续之前有两次尝试的原因”
'和延迟,为窗口启动留出时间'
多芬特
睡500
“查找窗口句柄”
FindThread的EnumWindows地址,lPID
'未找到-请尝试再次查找(更积极的等待)'
如果m_lShellHandle=0,则
睡眠(1000)
FindThread的EnumWindows地址,lPID
如果结束
'确保我们有一个有效的窗口'
如果m_lShellHandle为0,则
'继续检查窗口是否仍然可用'
Do While IsWindow(m_lShellHandle)
“允许重新绘制”
多芬特
“允许其他进程运行”
Sleepex300,真的
环
如果结束
ShellAndWait=True
端函数

您发布的代码提供了答案,问题是调用EnumWindows。VB6没有可用的64位编译器,任何VB6应用程序都将声明EnumWindows函数,类似于:

Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As _
Long, ByVal lParam As Long) As Long 
问题是,第一个参数是回调函数指针,Long是32位内存地址,AddressOf运算符只返回回调地址的32位。据我所知,在VB6中没有真正的方法来声明API函数以接受64位指针。事实上,如上所述,64位Office需要对VBA运行时进行扩展,以允许对64位安全的API调用使用LongPtr类型和PtrSafe声明。您将在问题和中找到有关这方面的更多信息

它可能在调试器的上下文中运行良好,因为它在WOW环境中运行,但是如果从另一个上下文调用它,它将失败,因为它将尝试在非WOW上下文中启动


虽然可能有一些变通方法,但它将涉及剥离绝大多数本机API调用。不过,正如评论所说,“命令控制台窗口很难控制,因此…”将其移植到.NET可能会更容易。

请告诉我,“将文本文件复制到端口”的确切含义是什么?对Windows 8的更改是否涉及从32位改为64位?如果是这样,它可能会破坏OCX中的所有Declare函数。(64位需要PtrSafe声明)。Thomas,您可以在命令提示符下使用“Copy”命令,例如:Copy“TextFileNamehere.txt”“PrinterPort”将文本文件直接打印到端口。对不起,我应该这么说的。共产国际,我明白你的意思。我也有这个想法,但确认在OCX上运行调试器时,它将调试器提升到与VB6在Windows 8上具有的相同权限,并且能够调用该命令。我不知道为什么这会被评为负2级,但只要我能得到一些提示,我对任何评级都很满意;)你有OCX的源代码吗?如果我能看到它是如何使用ShellExecute的,我可能会容易得多。我仍然想知道旧环境是32位还是新环境是64位。这改变了VB中的许多外部函数调用。@Comintern,我想你已经了解了一些东西。。。我以为我查过了,但显然还不够。我这样说是因为我激活了Windows8的真实管理员帐户,并以此帐户登录了服务,但命令仍然失败。。。权限似乎越来越不可能了。感谢您提供了这个非常详细和信息丰富的答案。尽管这个问题得到了负面评价,我还是从中学到了一些东西,感谢你们的时间和努力!非常感谢你。