Las Clases en Visual Basic:
Servidores OLE Out-ProcessUna 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 SistemaEn 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
'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