我是一名开发人员,正在努力维护一个非常需要在Vista下运行的VB6应用程序。但是,它必须在Vista Starter Edition下正常工作,因为这里是新版本的计算机(阿根廷)。
现在,关于技术内容:我的应用程序使用ImageMagick's convert处理图像(调整大小,黑白分割,旋转等),因此三个应用程序限制是......真正的痛苦,某个地方。最差:运行 convert 的失败不是(当前?)检测到的,所以当发生这种情况时,程序会挂断。
任何人都可以告诉我如何:
a_检测打开的应用程序的数量,以便我可以要求用户在重试之前关闭一些内容?可能是API调用?或
b_检测到转换(当前使用“Shell”功能运行)是否未正确启动?
请注意,“你应该将你的应用程序迁移到x”这样的评论应该发送给我的老板(不是我),不欢迎,并且会让我去你的地方并咬你的脚趾。不过,我需要一些时间来获得签证,但我向你保证,有一天,一个陌生人会敲你的门,问你的StackOverflow用户名,然后他会咬你的脚趾。
感谢您的考虑
答案 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