检测Vista Starter三开app限制

时间:2009-05-17 01:01:53

标签: vb6 windows-vista

我是一名开发人员,正在努力维护一个非常需要在Vista下运行的VB6应用程序。但是,它必须在Vista Starter Edition下正常工作,因为这里是新版本的计算机(阿根廷)。

现在,关于技术内容:我的应用程序使用ImageMagick's convert处理图像(调整大小,黑白分割,旋转等),因此三个应用程序限制是......真正的痛苦,某个地方。最差:运行 convert 的失败不是(当前?)检测到的,所以当发生这种情况时,程序会挂断。

任何人都可以告诉我如何:

a_检测打开的应用程序的数量,以便我可以要求用户在重试之前关闭一些内容?可能是API调用?或

b_检测到转换(当前使用“Shell”功能运行)是否未正确启动?

请注意,“你应该将你的应用程序迁移到x”这样的评论应该发送给我的老板(不是我),不欢迎,并且会让我去你的地方并咬你的脚趾。不过,我需要一些时间来获得签证,但我向你保证,有一天,一个陌生人会敲你的门,问你的StackOverflow用户名,然后他会咬你的脚趾。

感谢您的考虑

5 个答案:

答案 0 :(得分:4)

为什么不使用ImageMagickObject COM +接口?我从来没有使用它,但是文档声称它可以完成命令行实用程序所能做的一切,而无需运行额外的应用程序。

答案 1 :(得分:1)

无视,我需要在将来阅读超越主题的内容!

调用GetSystemMetrics()传递SM_STARTER(Const = 88)。

Option Explicit

Private Const SM_STARTER = 88&

Private Declare Function GetSystemMetrics Lib "user32" ( _
    ByVal nIndex As Long) As Long

Private Sub Form_Load()
    MsgBox CStr(GetSystemMetrics(SM_STARTER)) 'Zero (0) means False.
End Sub

这是针对XP定义的,对于Vista应该是相同的。很容易尝试,对吧?

答案 2 :(得分:0)

不是你想听的,但我敢打赌,“首发”很容易打破。

我敢打赌这样的工作:加载系统服务,接受SE_DEBUG,遍历所有进程,修补GetSystemMetrics(0x88)以在RAM中返回0。

答案 3 :(得分:0)

尝试从createprocess而不是shell开始?或者让服务管理它,而应用程序与服务进行通信。

答案 4 :(得分:0)

您是否尝试过检查Shell函数的返回值?文档说如果shell失败,它应该返回零。


Martin在评论中说:我试过,但每次检查返回值时,都是一些大于零的奇怪数字。

MarkJ再次:返回值应该是进程ID。可以进行API调用以检查它们是否是有效的进程ID。您可以尝试这样的事情:这总是为我显示一个“成功的”MsgBox,因为我没有Vista Starter Edition:)

Private Declare Function OpenProcess Lib "kernel32" ( _
    ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hObject As Long) As Long

Sub StartProcess()
   Dim ProcessId&
   Dim hProcess&
   Const PROCESS_QUERY_INFORMATION = &H400&

   ProcessId = Shell("notepad.exe", vbNormalFocus)
   hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)
   If hProcess = 0& Then
     MsgBox "Failed"
   Else
     MsgBox "Succeeded"
     CloseHandle hProcess
   End If

End Sub