2009-05-17 4 views
9

Estoy trabajando como desarrollador, manteniendo al día una aplicación VB6 que necesita funcionar con precisión en Vista. Sin embargo, debe funcionar bien en Vista Starter Edition, ya que es la versión que vienen con las nuevas computadoras aquí (Argentina).Detectando el límite de tres aplicaciones abiertas de Vista Starter

Ahora, en lo técnico: mi aplicación usa ImageMagick's convert para procesar imágenes (cambio de tamaño, segmentación en blanco y negro, rotación, etc.), por lo que el límite de tres aplicaciones es un verdadero dolor en ... bueno, en alguna parte. Peor: la falla al ejecutar convertir no se detecta (¿actualmente?), De modo que cuando esto sucede, el programa cuelga.

¿Puede alguien decirme cómo:

Detectar a_ el número de aplicaciones abiertas, por lo que se puede pedir al usuario que cierre algo antes de volver a intentar? Una llamada API, tal vez? o

b_ Detect que convert (actualmente se ejecuta con la función "Shell") no se inició correctamente?

Por favor, los comentarios como "deberías migrar tu aplicación a x" deberían enviarse a mi jefe (no a mí), no son bienvenidos y me harán viajar a tu lugar y morderte el dedo del pie. Sin embargo, me tomará algún tiempo conseguir la visa, pero te aseguro que un día un extraño tocará tu puerta, preguntará tu nombre de usuario de StackOverflow y luego te morderá el dedo del pie.

Gracias por su consideración

+0

que iba a sugerir el uso de un sistema operativo diferente, pero entonces leer el parte sobre la mordedura de los dedos ... :) – Zifre

+0

Además, ¿ha pensado en intentar parchear ImageMagick para que se ejecute dentro del mismo proceso que su aplicación? Esa sería probablemente la solución ideal. – Zifre

+0

Tal vez me gusta que me muerdan el dedo del pie ?. +1 para la pregunta interesante e interesante. – Kris

Respuesta

0

¿Ha intentado comprobar el valor de retorno de la función de Shell? La documentación dice que debería devolver cero si el shell falla.


Martin dice en los comentarios: he intentado, pero cada vez que comprobar el valor de retorno, es un número mayor que cero raro.

MarcaJ de nuevo: Se supone que los valores de retorno son ID de proceso. Podría ser posible realizar una llamada API para verificar si son ID de proceso válidos.Usted podría intentar algo como esto: esto siempre muestra una "lograron" MsgBox para mí, porque yo no tengo 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

Después de leer tu comentario lo intenté, pero cada vez que verifico el valor de retorno, hay algún número extraño mayor que cero. Personalmente, culpo al IDE, por no prever que diez años después de haber sido desarrollado el O.S. cambiaría de maneras completamente inesperadas. Pero solo soy yo. – Martin

1

Sigh

Indiferencia, tengo que leer más allá de la línea de asunto en el futuro!

Llame a GetSystemMetrics() pasando 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 

Esto se define para XP, y debería ser el mismo para Vista. Lo suficientemente fácil de probar, ¿verdad?

0

No es lo que quería escuchar, pero apuesto a que el "arranque" es lo suficientemente fácil de romper.

Apuesto a que algo como esto funciona: cargue el servicio del sistema, tome SE_DEBUG, recorra todos los procesos, parchee GetSystemMetrics (0x88) para devolver 0 en la RAM.

4

¿Por qué no utiliza la interfaz COM + de ImageMagickObject? Nunca lo he usado, pero la documentación dice que puede hacer todo lo que hacen las utilidades de la línea de comandos, sin ejecutar una aplicación adicional.

+0

Honestamente, no lo estoy usando porque me asusta (las interfaces COM + me dan pesadillas), pero como no puedo pensar en una solución mejor, lo intentaré. – Martin

0

¿Intenta comenzar con createprocess en lugar de a través del shell? O haga que un servicio lo administre, mientras la aplicación se comunica con el servicio.

Cuestiones relacionadas