Question

D'abord, je suis très nouveau dans Delphi et COM, mais je devrais construire l'application COM dans Delphi. Je lis beaucoup d'articles et de notes sur les internets, mais COM et COM dans Delphi ne sont toujours pas clair pour moi.

Mes sources - http://www.everfall.com/paste/id. php? wisdn8hyhzkt (environ 80 lignes).

J'essaie de faire une classe d'interface COM et Impl - cela fonctionne si je l'appelle une méthode d'interface de Delphi (je crée un objet impl via TestClient.Create), mais si je tente de créer un objet monde extérieur (à partir de Java , par l'intermédiaire com4j) ma demande est écrasé à l'exception suivante:

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

Si je mets un point d'arrêt dans QueryInterface - il se casse, mais quand je sors de la fonction -. Tous les accidents

Qu'est-ce que je fais mal? Ce que je manque encore? Ce que je peux / dois lire COM (Delphi) pour éviter des questions idiotes comme ça?

Était-ce utile?

La solution 3

J'ai fait une dll avec COM à partir de zéro et

  1. J'utilise DllRegisterServer - il m'a donné la possibilité de contrôle d'enregistrement du serveur (sur TComObjectFactory.RegisterClassObject dans ma première tentative)
  2. Je retire QueryInterface de mon TestComImpl
  3. Com4j supports que STA (Appartement) modèle de thread (je suppose que les utilisations RegisterClassObject MTA)
  4. Donc, si la classe enregistrée comme Appartement (STA) ou les deux -. Com4j peuvent créer des instances

Merci à tous pour l'aide!

Autres conseils

Il n'y a pas besoin de mettre en œuvre IUnkown.QueryInterface votre auto. Retirer cette méthode de TestComImpl et laissez TComObject manipuler. Assurez-vous également donner l'interface ITestCom un GUID.

Si l'accident se produit après le retour QueryInterface, ce que je ferais est de mettre un point d'arrêt dans l'application Java quand il appelle QueryInterface et voir ce qu'il essaie de faire. Cela vous donnera une idée de l'endroit où regarder.

Votre commentaire semble porter cela. Il est d'appeler QueryInterface, revenir un résultat qui dit que cette interface est bonne, et d'essayer de l'utiliser pour quelque chose qui immédiatement les pauses. Mais si vous commentez le code qui lui indique l'interface est bon, il finit par ne pas essayer d'utiliser l'interface et les sauts de rien.

Si vous n'êtes pas familier avec Delphi, une violation d'accès signifie généralement un déréférencement de pointeur NULL. Ici, il est dit que votre pointeur d'instruction est à l'emplacement de mémoire 0x000002. Cela signifie que vous probablement en quelque sorte essayé d'appeler une méthode virtuelle (ou une méthode d'interface) sur un objet qui n'a pas été construit encore.

L'espoir qui aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top