Lio con CreateObject / GetObject... AYUDA POR FAVOR!

24/07/2006 - 01:44 por sierracebrian | Informe spam
Hola y de entrada gracias por atender...
El asunto: tengo un componente ActiveX DLL que esta declarado dentro de
Global.asa, este componente tiene 8 clases PublicNotCreatable y una
MultiUse (elemento de mayor jerarquia en mi modelo) Esta clase
instancia las demas clases y estas penden como propiedades de la clase
de primer nivel de modo que asi se accesen; todo ha ido de lujo, estas
clases hacen cosas tan variadas como desde el acceso a datos, gestion
de coneccion con soporte de transacciones, ejecucion de SQL statements
Update, Select, etc, tambien tengo clases que usan automatizacion de
Word (Word 11) y tengo subrutinas para subir archivo, abrirlo,
guardarlo como, hacer busqueda/sustitucion dentro del documento y
guardado. Tambien tengo otra clase que instancia otros componentes
referenciados para parsear archivos .eml y enviarlos (relay) a mi
servidor de email como MIME S/MIME etc, en realidad, lo que quiero
transmitir es que mi nivel es avanzado, soy muy entendido en VB6; y
todo funciona perfectamente EXCEPTO una clase que usa faxcomex.dll para
envio y gestion de trabajos de fax. Esta clase en modo depuracion
funciona perfectamente bien, le son pasados parametros, que son
montados en los objetos de la dll de automatizacion de fax para winxp
pro, los envia, anexa el IdJob a una base de datos, etc. Incluso tengo
un componenete que funciona fuera de proceso que mediante un timer se
conecta periodicamente al servidor de fax y recupera el status de cada
FaxJob para actualizar el resultado en la base de datos, etc. Todo
funciona de lujo... hasta que lo ejecuto en modo de ejecucion (no
depuracion) y mi clase que automatiza el envio de faxes, devuelve un
mensaje criptico (Operation Failed) he movido todas las propiedades de
seguridad, he agregado a cuenta de invitado de internet
(IUSR_NOMBRESERVIDOR) a los permisos de la impresora de fax, y nada!
todo falla!, he incluso modificado las propiedades del directorio
virtual sobre el que se ejecuta mi aplicacion web para funcionar con la
seguridad integrada de windows y me pide mi username y password de
windows, la aplicacion funciona como se espera hasta el momento de
mandar el Fax (m_Fax.Subit o M_Fax.ConnectedSubmit) ambos metodos
fallan, entonces he creado un componenete fuera de proceso ActiveX exe
que instancia una clase y la registra mediante Win32API con un par de
funciones 'magicas' que agregan mi instancia de clase al Registered
Object Table OLEREF_WEAK para lograr hacer uso de GetObject (algo
'imposible desde VB6 supuestamente) esto funciona PERFECTO en modo de
depuracion y en modo de ejecucion con clientes windows (no web) toda la
aplicacion funciona perfecto en modo de ejecucion EXCEPTO este modulo
de clase cuando el cliente esta ejecutando mediante IIS 5.1, devuelve
el clasico Error de VB 427, el objeto no puede crear 'GetObject'. La
conclusion: no puedo mandar imprimir un documento a mi fax ni por
patada de mula! Incluso he creado un std exe y desde el DLL que se
instancia desde Global.asa intento ejecutarlo mediante ShellExecute con
parametros para que sea este std exe quien envie el Fax y nada tampoco!
estoy frustradisimo con esto! Su ayuda es de mucho interes y
urgencia... pueden pedirme a sierracebrian@gmail.com y les dare un link
a el codigo fuente para mayor referencia

Preguntas similare

Leer las respuestas

#1 Matías Iacono
25/07/2006 - 15:45 | Informe spam
Bueno, creo que no quedó un punto sin tocar :)

Si no son problemas de permisos, y en depuración te funciona todo bien, sin
ver el código fuente (siempre y cuando sea esta posibilidad), podría suceder
lo mismo que cuando usas WINSOCK desde VB6, donde si quieres enviar
múltiples mensajes en un bucle, solo llega el último, ya que entre medio hay
que meterle un DoEvents para que se ejecuten otros procesos.

Esto lo comento debido a que por lo general, cuando uno depura este tipo de
aplicaciones, lo hace paso a paso, dandole el tiempo necesario a los
controles para que procesen toda la información.

Se que posiblemente no tenga nada que ver, pero por lo que describes, haz
hecho practicamente todas las cosas que te podría haber dicho que hagas :)

Solo me quedó eso en el tintero. En todo caso, si me pasas el link del
código, para darle una mirada y ver si descubro algo más.

Saludos

Matías Iacono
Microsoft MVP ASP/ASP.net
Orador INETA
escribió en el mensaje
news:
Hola y de entrada gracias por atender...
El asunto: tengo un componente ActiveX DLL que esta declarado dentro de
Global.asa, este componente tiene 8 clases PublicNotCreatable y una
MultiUse (elemento de mayor jerarquia en mi modelo) Esta clase
instancia las demas clases y estas penden como propiedades de la clase
de primer nivel de modo que asi se accesen; todo ha ido de lujo, estas
clases hacen cosas tan variadas como desde el acceso a datos, gestion
de coneccion con soporte de transacciones, ejecucion de SQL statements
Update, Select, etc, tambien tengo clases que usan automatizacion de
Word (Word 11) y tengo subrutinas para subir archivo, abrirlo,
guardarlo como, hacer busqueda/sustitucion dentro del documento y
guardado. Tambien tengo otra clase que instancia otros componentes
referenciados para parsear archivos .eml y enviarlos (relay) a mi
servidor de email como MIME S/MIME etc, en realidad, lo que quiero
transmitir es que mi nivel es avanzado, soy muy entendido en VB6; y
todo funciona perfectamente EXCEPTO una clase que usa faxcomex.dll para
envio y gestion de trabajos de fax. Esta clase en modo depuracion
funciona perfectamente bien, le son pasados parametros, que son
montados en los objetos de la dll de automatizacion de fax para winxp
pro, los envia, anexa el IdJob a una base de datos, etc. Incluso tengo
un componenete que funciona fuera de proceso que mediante un timer se
conecta periodicamente al servidor de fax y recupera el status de cada
FaxJob para actualizar el resultado en la base de datos, etc. Todo
funciona de lujo... hasta que lo ejecuto en modo de ejecucion (no
depuracion) y mi clase que automatiza el envio de faxes, devuelve un
mensaje criptico (Operation Failed) he movido todas las propiedades de
seguridad, he agregado a cuenta de invitado de internet
(IUSR_NOMBRESERVIDOR) a los permisos de la impresora de fax, y nada!
todo falla!, he incluso modificado las propiedades del directorio
virtual sobre el que se ejecuta mi aplicacion web para funcionar con la
seguridad integrada de windows y me pide mi username y password de
windows, la aplicacion funciona como se espera hasta el momento de
mandar el Fax (m_Fax.Subit o M_Fax.ConnectedSubmit) ambos metodos
fallan, entonces he creado un componenete fuera de proceso ActiveX exe
que instancia una clase y la registra mediante Win32API con un par de
funciones 'magicas' que agregan mi instancia de clase al Registered
Object Table OLEREF_WEAK para lograr hacer uso de GetObject (algo
'imposible desde VB6 supuestamente) esto funciona PERFECTO en modo de
depuracion y en modo de ejecucion con clientes windows (no web) toda la
aplicacion funciona perfecto en modo de ejecucion EXCEPTO este modulo
de clase cuando el cliente esta ejecutando mediante IIS 5.1, devuelve
el clasico Error de VB 427, el objeto no puede crear 'GetObject'. La
conclusion: no puedo mandar imprimir un documento a mi fax ni por
patada de mula! Incluso he creado un std exe y desde el DLL que se
instancia desde Global.asa intento ejecutarlo mediante ShellExecute con
parametros para que sea este std exe quien envie el Fax y nada tampoco!
estoy frustradisimo con esto! Su ayuda es de mucho interes y
urgencia... pueden pedirme a y les dare un link
a el codigo fuente para mayor referencia

Respuesta Responder a este mensaje
#2 sierracebrian
26/07/2006 - 02:10 | Informe spam
Matias:

Primero, gracias por darme algo de tu tiempo y tu atencion; te cuento
los avances.
1. Ya logre hacer que envie faxes, usando un objeto en proceso (dll)
declarandolo OBJECT en Global.asa con scope Application.

2. El problema es que la naturaleza de mi componente es realizar un
trabajo complejo y lento: -Accesar a la base de datos, recuperar un par
de recordsets, abrir una plantilla con Word, crear un nombre de archivo
temporal, Guardar Como, usar algoritmos de busqueda reemplazo de
cadenas dentro del documento y usar datos de los recordsets en el
documento, y faxearlo, una vez faxeado, limpiar basura (documento(s)
temporales) y por ultimo, un nuevo acceso a la base de datos con
informacion del documento recien enviado (JobId del fax server). Esto
es bastante lento, inaceptablemente lento para ser usado desde una
variable Application; imagina 50 usuarios concurrentes intentando
enviar un Fax... por ello mi esmero en crear un componente Fuera de
Porceso (ActiveX exe) pero !PERO!

3. Todo intento de invocar una clase ActiveX EXE ya sea instanciando
desde una libreria DLL en proceso, ya sea desde la propia pagina asp
con vbs, ya sea registrando el componente en la ROT, nada, todo
falla... lo mas extrano de todo, es que no he logrado recuperar la
instancia en ejecucion pero si CreateObject; el mensaje criptico ahora
es...
llamo cualquier propiedad o metodo de mi objeto recien creado y
devuelve un 'Permission Denied'. Ya me volvi un culturoso, me zumbe
como 18 articulos del KB, mas otros tantos de DevX, mas otros de Wrox
P2P; ya incluso baje herramientas de diagnostico, como el IIS
Diagnostics, nada... todo falla.

Ya lei el dilema de COM con IIS de Neutral Threading, Apartment
THreading, Single Apartment Threading. el resumen de todas esas
lecturas es solo una; IIS usa un marshaling y proxies COM+ donde
recicla las instancias de los objetos, por eso es solo posible usar un
componente multiprocesos desde una variable Application; y el ejecutor,
el dueno del proceso es IWAM_MACHINENAME, ya dispuse los permisos de
tal modo que la ejecucion del server activex exe sea impersonando IWAM_
nada!
Yo ya hice un reformato de disco duro, una instalacion nueva, limpia de
Win XP Pro SP2 y una correcta instalacion y configuracion de IIS 5.1,
(al menos, eso creo, la herramienta IIS Diagnostics no arroja errores
de autenticacion) y el resumen es NO PUEDO HACER FUNCIONAR UN COM
ActiveX EXE en mi aplicacion web y la requiere, requiere esta
funcionalidad para manejar un Queue de Fax. Porque? Que sigue ahora?

Muchas gracias!



Matías Iacono ha escrito:

Bueno, creo que no quedó un punto sin tocar :)

Si no son problemas de permisos, y en depuración te funciona todo bien, sin
ver el código fuente (siempre y cuando sea esta posibilidad), podría suceder
lo mismo que cuando usas WINSOCK desde VB6, donde si quieres enviar
múltiples mensajes en un bucle, solo llega el último, ya que entre medio hay
que meterle un DoEvents para que se ejecuten otros procesos.

Esto lo comento debido a que por lo general, cuando uno depura este tipo de
aplicaciones, lo hace paso a paso, dandole el tiempo necesario a los
controles para que procesen toda la información.

Se que posiblemente no tenga nada que ver, pero por lo que describes, haz
hecho practicamente todas las cosas que te podría haber dicho que hagas :)

Solo me quedó eso en el tintero. En todo caso, si me pasas el link del
código, para darle una mirada y ver si descubro algo más.

Saludos

Matías Iacono
Microsoft MVP ASP/ASP.net
Orador INETA
Respuesta Responder a este mensaje
#3 sierracebrian
26/07/2006 - 10:03 | Informe spam
He resuleto el asunto!!!!

Todo el circo consiste en la configuracion DCOM, no COM+; cuando se
crea un componente ActiveX EXE, se debe usar la opcion subproceso por
objeto, se compila (recomiendo usar la tecnica de crear dos
compilaciones; una sin compatibilidad binaria, anezando al nombre del
compilado un extra, ejemplo: miproyecto_.exe, luego fijar a
compatibilidad binaria a este (miproyecto_.exe) y compilar como
miproyecto.exe), Despues debemos hacer Inicio->Ejecutar->Dcomcnfg, esto
abre la consola de configuracion, ir hasta Equipos->MiPC (o el equipo
donde reside el componente) y aparece una larga lista de todo lo
instalado y correctamente registrado; la solucion magica consiste en
dar permisos al menos de Lectura, y permitir la ejecucion local y
remota a los usuarios IWAM_NOMBRESERVIDOR, IUSR_NOMBRESERVIDOR, o bien,
para debug, al grupo Todos, que incluye SYSTEM tambien. En la ultima
pestana, seleccionar ejecutar como->escoger INTERACTIVO, y cerrar y
salir. Con esto, ya es posible instanciar ActiveX EXE como usuario
anonimo desde nuestra aplicacion Web!
Aun no logro hacer funcionar el GetObject tan deseado que funciona
perfectamente bien desde cualquier cliente Win32; ya lo probe con
clientes compilados Delphi, VB6, VB 2005 y nomas no logro hacer
funcionar mi GetObject desde la aplicacion Web... pero bueno, en lugar
de crear un spool con un queue como tenia ya disenado, lo que hago es
que creo un subproceso para cada tramite tardado y demandante, la
llamada toma un segundo porque disparo el objeto en un hilo
independiente... usando un timer o un Sleep por 500 milisegundos...
espero que si alguien tiene dilema con Permission Denied en ASP pueda
tomar ventaja de mi larga curva de aprendizaje; por cierto Microsoft,
mejor documentacion! fue un carnaval aprender esto!

ha escrito:

Matias:

Primero, gracias por darme algo de tu tiempo y tu atencion; te cuento
los avances.
1. Ya logre hacer que envie faxes, usando un objeto en proceso (dll)
declarandolo OBJECT en Global.asa con scope Application.

2. El problema es que la naturaleza de mi componente es realizar un
trabajo complejo y lento: -Accesar a la base de datos, recuperar un par
de recordsets, abrir una plantilla con Word, crear un nombre de archivo
temporal, Guardar Como, usar algoritmos de busqueda reemplazo de
cadenas dentro del documento y usar datos de los recordsets en el
documento, y faxearlo, una vez faxeado, limpiar basura (documento(s)
temporales) y por ultimo, un nuevo acceso a la base de datos con
informacion del documento recien enviado (JobId del fax server). Esto
es bastante lento, inaceptablemente lento para ser usado desde una
variable Application; imagina 50 usuarios concurrentes intentando
enviar un Fax... por ello mi esmero en crear un componente Fuera de
Porceso (ActiveX exe) pero !PERO!

3. Todo intento de invocar una clase ActiveX EXE ya sea instanciando
desde una libreria DLL en proceso, ya sea desde la propia pagina asp
con vbs, ya sea registrando el componente en la ROT, nada, todo
falla... lo mas extrano de todo, es que no he logrado recuperar la
instancia en ejecucion pero si CreateObject; el mensaje criptico ahora
es...
llamo cualquier propiedad o metodo de mi objeto recien creado y
devuelve un 'Permission Denied'. Ya me volvi un culturoso, me zumbe
como 18 articulos del KB, mas otros tantos de DevX, mas otros de Wrox
P2P; ya incluso baje herramientas de diagnostico, como el IIS
Diagnostics, nada... todo falla.

Ya lei el dilema de COM con IIS de Neutral Threading, Apartment
THreading, Single Apartment Threading. el resumen de todas esas
lecturas es solo una; IIS usa un marshaling y proxies COM+ donde
recicla las instancias de los objetos, por eso es solo posible usar un
componente multiprocesos desde una variable Application; y el ejecutor,
el dueno del proceso es IWAM_MACHINENAME, ya dispuse los permisos de
tal modo que la ejecucion del server activex exe sea impersonando IWAM_
nada!
Yo ya hice un reformato de disco duro, una instalacion nueva, limpia de
Win XP Pro SP2 y una correcta instalacion y configuracion de IIS 5.1,
(al menos, eso creo, la herramienta IIS Diagnostics no arroja errores
de autenticacion) y el resumen es NO PUEDO HACER FUNCIONAR UN COM
ActiveX EXE en mi aplicacion web y la requiere, requiere esta
funcionalidad para manejar un Queue de Fax. Porque? Que sigue ahora?

Muchas gracias!



Matías Iacono ha escrito:

> Bueno, creo que no quedó un punto sin tocar :)
>
> Si no son problemas de permisos, y en depuración te funciona todo bien, sin
> ver el código fuente (siempre y cuando sea esta posibilidad), podría suceder
> lo mismo que cuando usas WINSOCK desde VB6, donde si quieres enviar
> múltiples mensajes en un bucle, solo llega el último, ya que entre medio hay
> que meterle un DoEvents para que se ejecuten otros procesos.
>
> Esto lo comento debido a que por lo general, cuando uno depura este tipo de
> aplicaciones, lo hace paso a paso, dandole el tiempo necesario a los
> controles para que procesen toda la información.
>
> Se que posiblemente no tenga nada que ver, pero por lo que describes, haz
> hecho practicamente todas las cosas que te podría haber dicho que hagas :)
>
> Solo me quedó eso en el tintero. En todo caso, si me pasas el link del
> código, para darle una mirada y ver si descubro algo más.
>
> Saludos
>
> Matías Iacono
> Microsoft MVP ASP/ASP.net
> Orador INETA
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida