Pregunta

En primer lugar, soy muy nuevo en Delphi y COM, pero no edificar aplicación COM en Delphi. He leído un montón de artículos y notas sobre los internets, pero COM y COM en Delphi aún no están claros para mí.

Mis fuentes - http://www.everfall.com/paste/id. php? wisdn8hyhzkt (alrededor de 80 líneas).

Trato de hacer una clase de interfaz COM y Impl - funciona si llamo a un método de interfaz de Delphi (creo un objeto a través de impl TestClient.Create), pero si intento crear un objeto desde el mundo exterior (desde Java , a través de com4j) mi solicitud chocó con la siguiente excepción:

Project Kernel.exe raised exception class $C0000005 with 
message 'access violation at 0x00000002: read of address 0x00000002'.

Si fijo un punto de interrupción en QueryInterface - se rompe, pero cuando salga de la función -. Todos los accidentes

Lo que estoy haciendo mal? Lo que todavía falta? Lo que puedo / debo leer sobre COM (en Delphi) para evitar preguntas tontas como esta?

¿Fue útil?

Solución 3

Me hizo una DLL con COM desde cero y

  1. utilizo DllRegisterServer - me dio la posibilidad de registro del servidor de control (más de TComObjectFactory.RegisterClassObject en mi primer intento)
  2. QueryInterface elimino de mi TestComImpl
  3. soportes Com4j única STA (Apartamento) roscado modelo (I asumen usos RegisterClassObject MTA)
  4. Así que si la clase registrada como (STA) o ambos -. Com4j pueden crear instancias

Gracias a todos por la ayuda!

Otros consejos

No hay necesidad de implementar IUnkown.QueryInterface su auto. Quitar ese método de TestComImpl y dejar TComObject manejarlo. También asegúrese de dar a la interfaz de ITestCom un GUID.

Si el accidente ocurre después del retorno de QueryInterface, lo que haría es poner un punto de interrupción en la aplicación de Java cuando se llama a QueryInterface y ver lo que intenta hacer a continuación. Eso te dará una idea de dónde buscar.

Su comentario parece confirmar esto. Está llamando a QueryInterface, volviendo un resultado que dice que esta interfaz es buena, y tratando de usarlo para algo que se rompe inmediatamente. Pero si comentar el código que indica que la interfaz es buena, se termina por no tratar de usar la interfaz, y nada se rompe.

Si usted no está familiarizado con Delphi, una violación de acceso por lo general significa una referencia a un puntero nulo. En este caso, se dice que el puntero de instrucciones está en la posición de memoria 0x000002. Eso probablemente significa que de alguna manera trató de llamar a un método virtual (o un método de interfaz) en un objeto que no se ha construido aún.

Espero que ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top