2010-04-23 13 views
2

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 clairs pour moi. Mes sources: http://www.everfall.com/paste/id.php?wisdn8hyhzkt (environ 80 lignes). J'essaie de créer une interface COM et une classe Impl - cela fonctionne si j'appelle une méthode d'interface de Delphi (je crée un objet impl via TestClient.Create), mais si j'essaye de créer un objet du monde extérieur (à partir de Java, par l'intermédiaire com4j) ma demande est écrasé à l'exception suivante:Violation d'accès après GetInterface/QueryInterface dans Delphi

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? Qu'est-ce que je manque encore? Qu'est-ce que je peux/devrait lire à propos de COM (en Delphi) pour éviter les questions stupides comme celle-ci?

+0

Si je décommenter le code dans QueryInterface - pas de violation d'accès, mais com4j dit que cette interface n'est pas prise en charge. – W55tKQbuRu28Q4xv

+0

Pouvez-vous nous donner une liste de code du côté Java à? –

+0

Désolé, pas maintenant. Je n'ai pas de projet à la maison. Généralement, il est générée automatiquement par com2j et ne comprend que CoCreateInstance (CLSID). – W55tKQbuRu28Q4xv

Répondre

0

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

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

Merci à tous pour votre aide!

0

Si l'incident se produit après le retour de QueryInterface, je voudrais placer un point d'arrêt dans l'application Java lorsqu'il appelle QueryInterface et voir ce qu'il tente de faire ensuite. Cela vous donnera une idée de l'endroit où regarder.

Votre commentaire semble confirmer cela. Il appelle QueryInterface, récupérant un résultat indiquant que cette interface est bonne et essayant de l'utiliser pour quelque chose qui se casse immédiatement. Mais si vous commentez le code qui indique que l'interface est bonne, il finit par ne pas essayer d'utiliser l'interface, et rien ne casse.

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

Espérons que ça aide!

+0

Merci pour la réponse, je vais essayer de tracer un côté 'java', mais l'adresse 0x02 ressemble à GetInterface corrompt la pile, mais je pense que c'est impossible. – W55tKQbuRu28Q4xv

2

Il n'est pas nécessaire d'implémenter IUnkown.QueryInterface vous-même. Supprimez cette méthode de TestComImpl et laissez TComObject la gérer. Veillez également à donner un GUID à l'interface ITestCom.

+0

Si je supprime IUnknown.QueryInterface - com4j dit que l'interface (ITestCom) n'est pas supportée. – W55tKQbuRu28Q4xv

+0

Si c'est le cas, de quoi descend votre objet? –

+0

Etes-vous sûr que l'interface a un IID (GUID) comme ceci: ITestCom = interface (IUnknown) ['{0D57624C-CDDE-458B-A36C-436AE465B477}'] procdure YourMethods; fin; –