2009-05-17 5 views
9

Я работаю разработчиком, явным образом поддерживаю приложение VB6, которое отчаянно нуждается в работе под Vista. Тем не менее, он должен отлично работать в Vista Starter Edition, так как здесь появились новые компьютеры (Аргентина).Обнаружение Vista Starter 3-open-app limit

Теперь в технических приложениях: мое приложение использует ImageMagick's convert для обработки изображений (изменение размера, сегментация по черно-белому, поворот и т. Д.), Поэтому ограничение трех приложений - настоящая боль ... ну где-то. Хуже всего: сбой при запуске конвертировать не обнаружен (в настоящее время?), Поэтому, когда это происходит, программа зависает.

Может кто-нибудь сказать мне, как:

a_ Detect количество открытых приложений, так что я могу попросить пользователя закрыть что-то перед повтором? Может быть, вызов API? или

b_ Определить, что конвертировать (в настоящее время работает с функцией «Шелл») не был запущен должным образом?

Пожалуйста, комментарии, такие как «вы должны перенести приложение в x», должны быть отправлены моему боссу (не мне), не приветствуются и заставят меня отправиться на ваше место и укусить ваш палец. Тем не менее, мне потребуется некоторое время, чтобы получить визу, но я заверяю вас, что однажды незнакомец постучит в вашу дверь, спросит ваше имя пользователя StackOverflow, а затем он укусит ваш палец.

Спасибо за ваше внимание

+0

Я собирался предложить использовать другую ОС, но потом я прочитал часть о палец ноги ... :) – Zifre

+0

Также вы подумали о попытке исправить ImageMagick для запуска внутри того же процесса, что и ваше приложение? Вероятно, это идеальное решение. – Zifre

+0

Может, мне нравится, когда мой палец укусил ?. +1 для интересного и интересного вопроса. – Kris

ответ

0

Вы пытались проверить возвращаемое значение функции Shell? Документация говорит, что он должен возвращать ноль, если оболочка терпит неудачу.


Мартин говорит, что в комментариях: Я пытался, но каждый раз, когда я проверяю возвращаемое значение, некоторое странное число больше нуля.

MarkJ снова: Возвращаемые значения должны быть идентификаторами процесса. Возможно, можно вызвать вызов API, чтобы проверить, являются ли они действительными идентификаторами процесса.Вы могли бы попробовать что-то вроде этого: это всегда показывает «удалось» 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 
+0

После прочтения вашего комментария я попытался, но каждый раз, когда я проверяю возвращаемое значение, это какое-то странное число больше нуля. Лично я обвиняю IDE, поскольку не предвидел, что через десять лет после разработки O.S. изменится совершенно неожиданными способами. Но это только я. – Martin

1

вздыхать

ИГНОРИРОВАНИЯ, мне нужно прочитать за темой в будущем!

Вызов GetSystemMetrics(), передающий SM_STARTER (a 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. Достаточно легко попробовать, верно?

0

Не то, что вы хотели услышать, но я буду держать пари, что «стартер» достаточно легко сломать.

Я буду держать пари, что-то вроде этого работает: загрузите системное обслуживание, возьмите SE_DEBUG, пройдите все процессы, исправив GetSystemMetrics (0x88), чтобы вернуть 0 в ОЗУ.

4

Почему вы не используете интерфейс ImageMagickObject COM +? Я никогда не использовал его, но в документации утверждается, что он может делать все утилиты командной строки без запуска дополнительного приложения.

+0

Честно говоря, я не использую его, потому что это пугает меня (интерфейсы COM + дают мне кошмары), но поскольку я не могу придумать лучшего решения, я попробую. – Martin

0

Попробуйте начать с createprocess, а не через оболочку? Или у вас есть служба, управляющая ею, а приложение общается с сервисом.