Problemas en COM+

222 views
Skip to first unread message

algc

unread,
Jul 5, 2011, 8:50:10 AM7/5/11
to Comunidad de Visual Foxpro en Español
Me encuentro desarrollando una librería de componentes que me permitan
trabajar bajo el paradigma cliente servidor (aplicaciones) y para
ello, he investigado todas las publicaciones que han llegado a mi mano
o bien que he encontrado en la Web.

En base a ello, he desarrollado una pequeña clase de prueba y la he
instalado (COM+ en la mmc de Distributed Com Services) en un Win2003
server. Posteriormente la he utilizado localmente sin tener problema
alguno y por último EXPORTÉ la aplicación COM+, obteniendo los
archivos MSI con los cuales instalé la aplicación distribuída en
varias estaciones WinXP.

El problema que estoy teniendo en estos momentos es que cuando intento
instanciar un objeto de la clase supuestamente instalada, obtengo el
mensaje "0x80004027 UNKNOWN COM STATUS CODE".

Investigando profundamente el tema, vuelvo a la consola MMC de
Distributed Com Services y veo que la clase instalada posee un icono
de una CAJA CERRADA con una PALANCA AZUL (lo cual difiere del resto de
los componentes).

Podría Ud. ayudarme a encontrar cual es el error que estoy
cometiendo?. Muchas gracias

Antonio Meza

unread,
Jul 5, 2011, 9:32:54 AM7/5/11
to publice...@googlegroups.com
hola!!!
 
Tu componente lo que hara es leer tablas dbf? porq dices que es para hacer tu aplicacion cliente - servidor!!!
 
Te pregunto porq no sera mejor trabajar con un motor de base de datos? como firebird o mysql, sqlserver!!!

Luis Maria Guayan

unread,
Jul 5, 2011, 9:49:28 AM7/5/11
to publice...@googlegroups.com
Mira si este artículo de Martín Salías te ayuda:

A poor man's database server


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Marco Plaza

unread,
Jul 5, 2011, 12:20:41 PM7/5/11
to Comunidad de Visual Foxpro en Español

Hola, al crear la aplicación esta no tiene permisos de activación
remota por defecto.
Entra en la consola de administración de componentes, busca tu
aplicación, expande
el nodo roles y añade la lista de usuarios remotos que pueden usar el
componente,
ejemplo: pc02\agarcia

Saludos.

Marco Plaza

algc

unread,
Jul 5, 2011, 1:13:13 PM7/5/11
to Comunidad de Visual Foxpro en Español
Mi idea es separar las reglas de negocio en un set de objetos a
distribuir desde un servidor del dominio y asi poder evitar los
problemas de distribución de versiones. Cualquier modificación a las
reglas de negocio se producen en un solo lugar

algc

unread,
Jul 5, 2011, 1:27:26 PM7/5/11
to Comunidad de Visual Foxpro en Español
Hola Marco: He creado un ROL y lo he incluido en mi aplicación. En
dicho ROL he incorporado a la cuenta de grupo USUARIOS del DOMINIO de
mi red y aún así (volviendo a instalar el paquete, exportándolo y
volviendo a instalar en el CLIENTE) el problema persiste

algc

unread,
Jul 5, 2011, 1:33:38 PM7/5/11
to Comunidad de Visual Foxpro en Español
Hola Luis: He leído el articulo de Martín Salías y pude hacer todo eso
que explica ya que todo se lleva a cabo en la misma estación de
trabajo. Ahora bien, el problema se produce al intentar EXPORTAR la
aplicacion a una estación CLIENTE. En otras respuestas que ya he
posteado se detalla cual es el inconveniente. Gracias por tu
colaboración.

On 5 jul, 10:49, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Mira si este artículo de Martín Salías te ayuda:
>
> A poor man's database serverhttp://www.universalthread.com/ViewPageArticle.aspx?ID=702
>
> *
> *
> *Luis María Guayán
> Tucumán, Argentina
> _________________________
> **http://www.PortalFox.com<http://www.portalfox.com/>*
> *Nada corre como un zorro
> _________________________*

Marco Plaza

unread,
Jul 5, 2011, 1:53:43 PM7/5/11
to Comunidad de Visual Foxpro en Español

Hola, no he trabajado con componentes en dominios de AD, pero puedes
simplemente probar creando los usuarios en la notación PC
\nombreusuario.

Humberto

unread,
May 7, 2011, 7:58:27 AM5/7/11
to publice...@googlegroups.com
 


__________ Información de ESET NOD32 Antivirus, versión de la base de firmas de virus 6263 (20110704) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

Humberto

unread,
May 7, 2011, 7:57:59 AM5/7/11
to publice...@googlegroups.com

algc

unread,
Jul 5, 2011, 1:22:31 PM7/5/11
to Comunidad de Visual Foxpro en Español
Gracias Luis, los pasos indicados por Martin Salías fueron los que yo
seguí y hasta lo último indicado por el articulo me anduvo
espectacular. El problema se produce cuando intento EXPORTAR la clase
para ser instanciada desde un cliente. Es alli donde (despues de
cumplir con los pasos de EXPORTACION en el servidor e INSTALACION en
el cliente) obtengo en la carpeta COM+ un icono con aspecto de CAJA
CERRADA (contrario a lo que sucede con los demas objetos) y verifico
que cuando ejecuto "createobject(´servidor.comprobantes´)" obtengo el
mensaje de error OLE.
Espero haber sido claro en mi exposición.

On 5 jul, 10:49, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Mira si este artículo de Martín Salías te ayuda:
>
> A poor man's database serverhttp://www.universalthread.com/ViewPageArticle.aspx?ID=702
>
> *
> *
> *Luis María Guayán
> Tucumán, Argentina
> _________________________
> **http://www.PortalFox.com<http://www.portalfox.com/>*
> *Nada corre como un zorro
> _________________________*
>

Marco Plaza

unread,
Jul 5, 2011, 2:23:01 PM7/5/11
to Comunidad de Visual Foxpro en Español
La caja cerrada indica que el componente no está en ejecución.Verifica
en una consola de visor de eventos de windows -> aplicación los
mensajes, tanto en el servidor como en tu cliente, si es un problema
de permiso de activación remota allí puedes ver el motivo de la falla.

Saludos.

Alberto Garcia Cano

unread,
Jul 5, 2011, 2:46:26 PM7/5/11
to publice...@googlegroups.com
El problema es que tambien he intentado crear el objeto en el CLIENTE utilizando createobjectex y me da el mismo error. Aclaro que en el SERVIDOR, el ícono de mi clase en COM+ es el de una CAJA ABIERTA, mientras que el ícono en el CLIENTE es el de una CAJA CERRADA. En el servidor puedo instanciar objetos SIN PROBLEMAS.

Marco Plaza

unread,
Jul 5, 2011, 2:49:59 PM7/5/11
to Comunidad de Visual Foxpro en Español

Puedes hacer lo mismo pero no usando com+ sino Dcom, es mas simple.

Prueba lo siguiente: copia tus ejecutables completos a otra carpeta,
y crea tu servidor como un servidor win32/com server, con otro
nombre,
crea un nuevo proyecto. o marca regenerate component Ids.

Luego entras a la consola de configuracion de componentes dcom y busca
tu servidor
y configúralo de esta forma:

permisos de inicio y activación: personalizados-> añade los usuarios
que pueden iniciar el componente y les
marcas acceso local y acceso remoto, activacion local y activacion
remota.

en identidad, te sugiero: crea un usuario en el servidor para tu
aplicacion, y le das los permisos que necesites para trabajar
( ejemplo acceso sólo a la carpeta de datos ), luego especificas
'este usuario' e indicas el nombre y la clave que le diste.

Luego desde tu cliente vfp no debes hacer mas nada, solo usa

oServidor=createobjectex(classId,pcServidor)
el classId lo puedes conocer instanciando tu servidor desde vfp y
usando comclassinfo(oServidor,4)

Espero te sirva.

Saludos.

Marco Plaza.

PD: nunca cambies la ruta del exe, o regeneres los clsId sin
desregistrar antes el servidor anterior.


On 5 jul, 13:27, algc <alberto.garciac...@gmail.com> wrote:

Alberto Garcia Cano

unread,
Jul 6, 2011, 6:53:11 AM7/6/11
to publice...@googlegroups.com
Estimado Marco: Agradezco sinceramente tus aportes. Te comento que la tecnología DCOM ya la utilizo desde hace mucho tiempo al haber puesto en marcha un sitio aplicando la tecnología que supo explicar claramente Rick Strahl. 

El problema que encuentro con DCOM al intentar separar en capas mi aplicación es que carece (por lo menos hasta lo que yo conozco) de las ventajas que ofrece COM+ en lo que hace a la "puesta en disponibilidad" del componente. Esto es asi ya que en COM+ tengo la capacidad de DESHABILITAR unicamente el componente que necesito actualizar sin por eso frenar el trabajo del resto de los componentes. Debo decir que cuando tengo que realizar alguna tarea de mantenimiento de mis componentes DCOM, siempre soy objeto de insultos de todo tipo ya que debo parar todo el Internet Information Server para poder realizar el procedimiento.

Es por todo lo expuesto que verdaderamente NECESITO que sea COM+ mi solución.

Desde ya, muchas gracias por tu colaboracion

Marco Plaza

unread,
Jul 6, 2011, 9:34:26 AM7/6/11
to Comunidad de Visual Foxpro en Español
Hola Alberto, un proceso dcom lo puedes terminar desde el dos usando :
taskkill /im programa.exe /f , y en referencia al componente com+
revisa la consola de eventos de windows en el cliente y me dices como
te fué.

Saludos.


On Jul 6, 6:53 am, Alberto Garcia Cano <alberto.garciac...@gmail.com>
wrote:

Alberto Garcia Cano

unread,
Jul 6, 2011, 11:36:28 AM7/6/11
to publice...@googlegroups.com
Vamos progresando, jeje. En el visor de sucesos sale la frase "Se ha deshabilitado el componente o aplicación que contenía el componente. ".

Googleando esa frase encuentro datos acerca de la instalacion de componentes Windows. Dice que tiene que estar habilitada la funcion Enable network COM+ access en Application Server del servidor, lo cual verifico que se encuentra correctamente instalado.

Simplemente quería ir comunicando al foro mis "avances"


Marco Plaza

unread,
Jul 6, 2011, 11:41:53 AM7/6/11
to Comunidad de Visual Foxpro en Español
Alberto prueba desactivando el firewall del servidor y prueba
nuevamente instanciar el componente. Si eso resuelve debes habilitar
una regla para permitir componentes remotos, mira aquí:

http://social.technet.microsoft.com/Forums/en-IE/winserversecurity/thread/10259bd7-602b-496c-bd59-4f932e366162



On Jul 6, 11:36 am, Alberto Garcia Cano <alberto.garciac...@gmail.com>
wrote:
> Vamos progresando, jeje. En el visor de sucesos sale la frase "Se ha
> deshabilitado el componente o aplicación que contenía el componente. ".
>
> Googleando esa frase encuentro datos acerca de la instalacion de componentes
> Windows. Dice que tiene que estar habilitada la funcion *Enable network COM+
> access *en* Application Server *del servidor, lo cual verifico que se
> encuentra correctamente instalado.
>
> Simplemente quería ir comunicando al foro mis "avances"
> *
> *
> *
> *

Alberto Garcia Cano

unread,
Jul 6, 2011, 1:57:04 PM7/6/11
to publice...@googlegroups.com
Anduvo !!!!  Fue cuestión de habilitar  Enable network COM+ , desinstalar en el SERVIDOR, en el CLIENTE y volver a armar, exportar e instalar todo. Muchas gracias por la ayuda !!!

Marco Plaza

unread,
Jul 6, 2011, 2:34:29 PM7/6/11
to Comunidad de Visual Foxpro en Español
Que bueno! yo también tengo un proyecto en 3 capas, pero no le he
metido de lleno. Veo que vas a trabajar con esto, y como yo también
estaré en eso en unas semanas, creo que podemos colaborar de cerca.
Aquí te mando un codigo que hice para automatizar la generación del
componente y su registro. Modifícalo según tus parámetros, te
automatiza la creación del dll y la aplicacion com:

Aquí podrás ver como usar el objeto comadmin desde VFP..

Saludos
Marco Plaza

*-------------------------------------------------------
* Programa Creado por Marco A. Plaza
* se permite su uso y modificación
* remitir mejoras a plaza...@hotmail.com
* Caracas - Venezuela
*------------------------------------------------------

NombreAplicaciónCom = 'COMAPP'
DLLnom = 'X:\WWW\SERVLOCAL\MPFOXISAPI\MPFOXISAPI.DLL'
proyecto = 'X:\VFP\PROYECTOS\MPFOXISAPI\MPFOXISAPI.PJX'


DO ApagarComApp
DO CrearDll
Do BorrarComApp
DO CrearComApp
DO listarUsuarios
do exportarApp


*-------------------------------------------
procedure ApagarComApp
*-------------------------------------------
oComadmin = Createobject("ComAdmin.COMAdminCatalog")
oComadmin.shutdownapplication(NombreAplicacionCom)
oComadmin = .Null.

*-----------------------------------------------------
Procedure crearDll
*-----------------------------------------------------

=DLLUnreg(dllnom)
Build Mtdll (DLLnom) From (proyecto) recomp



*---------------------------------------
FUNCTION DLLUNREG( dllnom as String ) as Boolean
*---------------------------------------

If File(DLLnom)

Declare Integer DllUnregisterServer In (DLLnom)
DllUnregisterServer()
Clear Dlls

Endif


*-----------------------------------------------------
Procedure BorrarComApp
*-----------------------------------------------------


oComAdmin = Createobject('ComAdmin.ComAdminCatalog')

oAplicaciones = oComAdmin.GetCollection('Applications')
oAplicaciones.Populate

oComAdmin = .Null.

NumApps = oAplicaciones.Count-1


zIndex = 0

For EACH oAplicacion IN oAplicaciones


If oAplicacion.Name == NombreAplicacionCom

oAplicaciones.Remove(zIndex)
zIndex = zIndex-1

ENDIF

zIndex = zIndex+1

Endfor

oAplicaciones.SaveChanges
oAplicaciones = .null.




*--------------------------------------------------------------
Procedure CrearComApp
*-------------------------------------------------------------


oComAdmin = Createobject('ComAdmin.ComAdminCatalog')
oAplicaciones = oComAdmin.GetCollection('Applications')

oIridioAplicacion = oAplicaciones.Add

With oIridioAplicacion
.Value('Name') = NombreAplicacionCom
.Value('Description') = 'Servidor Com'
Endwith

oAplicaciones.SaveChanges

guid = oIridioAplicacion.Value('ID')

oComAdmin.InstallComponent(guid,Fullpath(DLLnom),'','')

oRoles = oAplicaciones.GetCollection('Roles',oIridioAplicacion.key)

oNuevoRol = oRoles.Add
oNuevoRol.Value('Name')='Usuario de Aplicacion Com'

oRoles.SaveChanges


oUsuariosDelRol = oRoles.getCollection('UsersInRole',oNuevoRol.key)

oNuevoUsuarioDelRol = oUsuariosDelRol.Add
oNuevoUsuarioDelRol.value('User') = 'Pc01\Marco'

oUsuariosDelRol.SaveChanges


*------------------------------------------
procedure exportarApp
*------------------------------------------
ERASE (CURDIR()+'MSI\'+NombreAplicacionCom+'.msi')
oComAdmin.ExportApplication(NombreAplicacionCom,CURDIR()+'MSI
\'+NombreAplicacionCom,2)


*------------------------------------------------------
PROCEDURE listarUsuarios
*------------------------------------------------------

oComAdmin = Createobject('ComAdmin.ComAdminCatalog')

oAplicaciones = oComAdmin.GetCollection('Applications')
oAplicaciones.Populate

NumApps = oAplicaciones.Count-1


For EACH oAplicacion IN oAplicaciones


If oAplicacion.Name == NombreAplicacionCom


oRoles = oAplicaciones.GetCollection('Roles',oAplicacion.Key)
oRoles.populate

FOR EACH rol IN oRoles

? 'Rol:',rol.name


oUsuariosdelRol = oRoles.GetCollection('UsersInRole',rol.key)
oUsuariosdelRol.populate

FOR EACH usuario IN oUsuariosdelRol

? 'Usuario.:' , usuario.name

ENDFOR


ENDFOR

ENDIF


Endfor

oAplicaciones = .null.


Alberto Garcia Cano

unread,
Jul 6, 2011, 2:59:44 PM7/6/11
to publice...@googlegroups.com
Hola Marco: Bueno, superado el problema de acceso remoto, ahora paso a problemas en serio jajajajajajaj. Por una cuestión que todavía no me puse a leer en serio, parece ser que dentro del código de los métodos de la clase debo poner las siguientes instrucciones:

loMtx=createobject("MTXAS.APPSERVER.1")
loContext=loMtx.GetObjectContext()

.... acá va el código del método

loContext.SetComplete()
loContext =NULL
loMtx = NULL


El problema que tengo ahora salta en loContext.SetComplete() y cuando me voy a fijar que contiene loContext me encuentro con que type("loContext") = "O" pero si escribo ?loContext obtengo .F. en pantalla. Vale decir que loContext.SetComplete() nunca me va a devolver nada.

Alguna idea al respecto?

Marco Plaza

unread,
Jul 6, 2011, 3:15:04 PM7/6/11
to Comunidad de Visual Foxpro en Español
Hola el contexto de los objetos lo usas para obtener información de la
activación, el usuario etc. y principalmente según he leído para que
cuando tienes varios objetos com interviniendo en una transacción
éstos puedan 'votar' y así saber si la transacción está completada,
donde ejecutarás setcomplete, pero no es necesario si no es tu caso...
al crear la aplicación indicas si requiere manejo de transacciones,
marca que no.

no dispongo de mucho tiempo ahora, pero te puedo mandar este libro,
donde está todo lo que se necesita saber acerca de com+ ( claro al
tiempo de publicación, ahora está com+ 1.5 con nuevas capacidades ).

https://dl.dropbox.com/s/lyos5ca0o2fayo2/Professional%20Windows%20DNA%20%5BWrox%202000%5D.pdf?dl=1

Espero te sirva.


On Jul 6, 2:59 pm, Alberto Garcia Cano <alberto.garciac...@gmail.com>
wrote:
> Hola Marco: Bueno, superado el problema de acceso remoto, ahora paso a
> problemas en serio jajajajajajaj. Por una cuestión que todavía no me puse a
> leer en serio, parece ser que dentro del código de los métodos de la clase
> debo poner las siguientes instrucciones:
>
> loMtx=createobject("MTXAS.APPSERVER.1")
> loContext=loMtx.GetObjectContext()
>
> .... acá va el código del método
>
> loContext.SetComplete()
> loContext =NULL
> loMtx = NULL
>
> El problema que tengo ahora salta en *loContext.SetComplete()* y cuando me
Reply all
Reply to author
Forward
0 new messages