Las Clases en Visual Basic:
Servidores OLE Out-Process

Una utilidad para averiguar si una aplicación se está ejecutando

 

Actualizado el 10-Jun-97



He puesto esto en otro archivo, ya que el de las clases estaba un poco "relleno" y te ibas a aburrir de esperar.

Este lo voy a empezar con un servidor OLE que es un ejecutable, osea lo que se llama un out-process OLE server.
Ya sabrás que hay dos tipos de servidores OLE (por llamarlos de alguna forma), estos pueden ser in-process que son librerías dinámicas (DLL) y se ejecutan en el mismo proceso que el resto de la aplicación y los out-process que son archivos ejecutables (EXE) y se ejecutan en su propio proceso, es decir que no tienen que estar compilado junto con el resto de los módulos (lógico, porque sino no sería un EXE...)

Normalmente los servidores OLE in-process (DLL) suelen, o al menos deberían, tener un form modal y los servidores out-process (EXE) no deben tener un formulario modal. Por lo menos eso es lo que nos dicen en la documentación de VB4, cosa que parece ser que ha cambiado en VB5.

Ya he puesto antes algo parecido a esto que pongo ahora, era para saber los recursos libres en VB4 de 32 bits, para ello se llamaba a un servidor OLE realizado con VB4 16 bits, si quieres ver el listado del ejemplo anterior, pulsa en el siguiente link:
Servidor OLE para obtener los recursos del Sistema

En este caso es algo similar, pero lo que se comprueba es si una aplicación determinada se está ejecutando y si es así se devuelve el path completo de la misma.
La razón de acceder a esta información mediante un ejecutable de 16 bits es por la razón de que esta función del API en el modo de 32 bits sólo comprueba las que están en el mismo proceso que el form que realiza la llamada, por tanto al usar 16 bits funciona, ya que TODO el entorno es un sólo proceso, así que mediante 16 bits se pueden comprobar todas las aplicaciones que se están ejecutando.

Agradezco a Max Resnik la consulta que me hizo, porque así conseguí hacerlo.
Max: espero que esta página te ayude a comprender mejor cómo funciona.

Para usarlo, se debe compilar en primer lugar el proyecto de 16 bits y ejecutarlo. Cuando se ejecuta no hace nada, sólo se registra en el sistema, que es lo que necesitamos para posteriormente refernciarlo desde el entorno de VB.

Cuando queramos usarlo en un proyecto de 32 bits, sólo hay que hacer una referencia a esa librería y usar el objeto expuesto.
El ejemplo de 32 bits te demuestra cómo hacerlo.

Pulsa aquí para bajar los listados de ejemplo. (getmh.zip 2.53 KB)

Bien, veamos el listado del proyecto de 16 bits y el formulario de prueba de 32 bits.

'Listado de getMH16.vbp
Class=cGetMH16; CGETMH16.CLS
Module=bGetMH; BGETMH.BAS
ProjWinSize=77,568,232,327
ProjWinShow=2
HelpFile=""
Title="GetModuleHandle"
ExeName32="Shell_test_32.exe"
ExeName="GETMH16.EXE"
Name="GetModuleHandle"
HelpContextID="0"
StartMode=1
VersionCompatible32="0"
VersionCompatible="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionComments="Servidor OLE para GetModuleHandle"
VersionCompanyName="Guillermo Som -Nerja"
VersionFileDescription="Servidor OLE de 16 bits para GetModuleHandle"
VersionLegalCopyright="©Guillermo Som Cerezo, 1997"
VersionProductName="GetMH16, revisión del 5/Jun/97"
'Listado de BGETMH.BAS
Attribute VB_Name = "bGetMH"
'Módulo para GetModuleHandle (OLE server 16bits)
Option Explicit


Public Sub Main()
    'Debe ser la entrada al Servidor OLE
    
End Sub
'Listado de CGETMH16.CLS
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "cGetMH16"
Attribute VB_Creatable = True
Attribute VB_Exposed = True
'
'Clase para GetModuleHandle                     ( 5/Jun/97)
'
Option Explicit

Private Declare Function GetModuleHandle Lib "Kernel" _
	(ByVal lpModuleName As String) As Integer
Private Declare Function GetModuleFileName Lib "Kernel" _
	(ByVal hModule As Integer, ByVal lpFilename As String, _
	 ByVal nSize As Integer) As Integer


Public Function GetMH16(ByVal sProg As String) As String
    'Devolverá el directorio de la aplicación o
    'una cadena vacía si no está en ejecución
    Dim ret%, hModule%
    Dim sFile$
    
    sFile = String$(300, 0)
    
    GetMH16 = ""
    hModule = GetModuleHandle(sProg)
    If hModule Then
        ret = GetModuleFileName(hModule, sFile, 260)
        If ret Then
            GetMH16 = sFile
        End If
    End If
End Function
'Ahora el listado y una "captura" del form de prueba

El form de prueba -getMh

'Este es GetMH.vbp, la referencia debe ser la que te indique en tu ejecutable
'Te recomiendo que la quites y hagas la referencia en el entorno, sino seguramete
'no te funcionará
Form=GetMH.Frm
Reference=*\G{93D07C14-DD3A-11D0-967C-0020A9022969}#1.0#0#D:\VB4\PRUEBAS\SHELLP~1\GETMH16.EXE#GetModuleHandle
ProjWinSize=77,568,232,327
ProjWinShow=2
IconForm="Form1"
HelpFile=""
Title="GetMH_test"
ExeName32="GetMH.exe"
Name="GetMHtest"
HelpContextID="0"
StartMode=0
VersionCompatible32="0"
VersionCompatible="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionComments="Prueba para saber si una aplicación se está ejecutando"
VersionCompanyName="Guillermo Som -Nerja"
VersionFileDescription="Form para probar GetMH16"
VersionLegalCopyright="© Guillermo Som Cerezo, 1997"
VersionProductName="GetMH"
'El listado del Form:
'
'Prueba de GetModuleHandle                          ( 5/Jun/97)
'
Option Explicit


Private Sub Command1_Click()
    'Crear una referencia al objeto que nos interesa
    Dim miMH As New cGetMH16
    Dim sFile$
    
    'Si sFile es una cadena vacía es que no se está ejecutando
    sFile = miMH.GetMH16(Text1)
    If Len(sFile) = 0 Then
	Label2 = "No se está ejecutando " & Text1
    Else
	Label2 = sFile
    End If
    Set miMH = Nothing
End Sub


Private Sub Form_Load()
    'Esto no es necesario, sólo es para comprobar
    'If Shell("c:\Windows\Notepad.exe") Then
    'End If
End Sub


Private Sub Form_Unload(Cancel As Integer)
    Set Form1 = Nothing
End Sub

ir al índice