2009-01-20 5 views
2

J'ai un ensemble de bibliothèques écrites en Delphi.NET (.NET 1.1) que je veux utiliser dans mon application Win32 (Delphi). Pour les problèmes de performance, j'ai décidé de suivre la route COM.L'utilisation de classes .Net via COM Objets dans Delphi se bloque parfois

Parfois, après la reconstruction de la DLL, lorsque j'essaie d'instancier les objets exposés via COM, l'application Win32 se bloque à l'appel CreateComObject. Comment puis-je résoudre ce problème?

Pour exposer les bibliothèques Delphi.NET par COM, ajouter les attributs suivants au-dessus de chaque décélération de la classe:

[Comvisible(true)] 
[Guid('some guid')] 
[ClassInterface(ClassInterfaceType.AutoDual)] 

Après avoir compilé la DLL, je produis un fichier TLB.pas, ce fichier contient des définitions pour tous les publics et COM classes visibles et interfaces dans la DLL. Ce fichier me permet d'utiliser plus facilement les objets COM dans mon application Delphi Win32. Enfin, j'inscris le .dll et le flip .tlb en utilisant regasm.

J'ai essayé de vous désinscrire et d'exécuter l'application Win32, qui fait référence à la DLL; Je m'attendais à recevoir une erreur d'exécution, mais l'application a encore une fois accroché à l'appel CreateComObject().

J'ai également essayé de désinscrire et d'enregistrer la DLL sans aucun problème.

p.s. J'utilise BDS 2006

+0

Il se bloque tout simplement pas CPU ? Pas d'erreur? Ne retourne jamais? –

+0

oui, il ne revient jamais de l'appel, aussi l'utilisation du processeur n'est pas ancrée –

+0

est-il arrivé dans d'autres langages? C++ OU VB/VBScript? – Baget

Répondre

0

Assurez-vous que vous avez arrêté le code correctement et ne l'arrêtez pas dans le débogueur. J'ai trouvé que tuer des applications inter-processus en utilisant le débogueur peut causer toutes sortes de problèmes, nécessitant généralement un redémarrage pour les effacer. Il faut de la discipline pour le faire car normalement vous pouvez le faire sans problème.

+0

L'application. a été arrêté correctement, j'ai également essayé de redémarrer ma machine. –

1

J'ai des expériences mitigées avec COM; COM peut parfois être une vraie douleur pour devenir stable, donc si ce n'est pas nécessaire, je prends souvent une autre route.

Dans ce cas, vous pouvez essayer de contourner COM en utilisant P/Invoke inverse.

Voici quelques articles qui peuvent vous aider à ce sujet:

http://blogs.codegear.com/timjarvis/2006/11/10/29270 http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm http://www.blong.com/Conferences/BorCon2004/Interop1/Win32AndDotNetInterop.htm

Vous pouvez obtient plus de succès lorsque vous Google sur "Delphi Inverse PInvoke" mais celles ci-dessus sont les meilleurs articles.

Cordialement,

Jeroen Pluimers

0

Utilisation RemObjects Hydra est un moyen facile de mélanger le code Delphi géré et non géré. Mais malheureusement, il est assez cher - 499 $ :(

Mise à jour:..? Essayer Delphi.Net projet open source Ce projet est inactif, mais vous pouvez l'utiliser pour Win32 -> interaction ensemble dotNet1.1