Определение предела трех открытых приложений Vista Starter - PullRequest
9 голосов
/ 17 мая 2009

Я работаю разработчиком, в настоящее время занимаюсь обслуживанием приложения VB6, которое крайне необходимо для нормальной работы под Vista. Тем не менее, он должен нормально работать под Vista Starter Edition, поскольку эта версия поставляется с новыми компьютерами (Аргентина).

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 17 мая 2009

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

1 голос
/ 17 мая 2009

Вздох

Не обращайте внимания, мне нужно читать за строчкой темы!

Вызовите 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. Достаточно легко попробовать, верно?

0 голосов
/ 17 мая 2009

Вы пытались проверить возвращаемое значение функции 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 голосов
/ 17 мая 2009

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

0 голосов
/ 17 мая 2009

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

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

...