En lugar de permitir varias instancias, mejor permítele hacer varias tareas a la vez dentro de la aplicación.
El ejemplo que les expongo hace uso de WMI de Windows y es bastante sencillo.
En esencia es una consulta sql que nos devuelve los nombres de los procesos que están en ejecución. He dejado los comentarios para explicar que en mi caso muy particular, yo pregunto si la cantidad de procesos es mayor que o igual a 3 (y usando un like en el sql) porque hago uso de dos programas: uno que será el "launcher" el cual buscará el ejecutable compilado más reciente y éste será el que se ejecute (Así no tengo que interrumpir las labores de otros usuarios cuando tenga que hacer alguna correción en otras pantallas)
FUNCTION MyProcessName *.* Determina si el programa de recibo bodega ya está en ejecución. *.* De ser así, devuelve un valor lógico que será usado para terminar o continuar con el programa. *-* Se debe tomar en cuenta que ReciboBodega es ejecutado usando dos programas: *-* recibo_bodega.exe y recibo_bodegannn.exe LOCAL lcComputer as String lcComputer = '.' loWMIService = Getobject('winmgmts:'+'{impersonationLevel=impersonate}!\\' + lcComputer + '\root\cimv2') colProcessList = loWMIService.ExecQuery('Select * from Win32_Process where name like "recibo_bodega%"') IF colProcessList.count>=3 RETURN .T. ELSE RETURN .F. ENDIF ENDFUNC
Pero en su caso puede preguntar directamente por el nombre de su ejecutable y cuando "count" sea igual a uno, su función regresará un valor Cierto.
Por último, en el su prg principal, en sus primeras líneas deberás poner:
IF MyProcessName() RETURN .F. ENDIF
Saludos,
Jorge Luis Vejerano, Panamá
Gracias, está muy buena la función.
ResponderBorrar