2012-12-13 1 views
3

J'essaie d'utiliser un .NET COM-dll qui fait partie du SDK pour une interface de commande de moteur pas à pas. Le SDK fournit une bibliothèque de types, que j'ai importée dans Delphi via 'Importer un composant> Importer une bibliothèque de types'. Bien que je connaisse les bases de la programmation COM, j'ai du mal à faire fonctionner l'interface. Le problème semble être que la CoClass ainsi que le proxy OLE Server exposent uniquement une interface vide, c'est-à-dire une interface sans aucune méthode ( _ComMotorCommands). Coulée de là à la réelle IComMotorCommands donne une Interface non prise en charge erreur.L'accès à COM-dll via la bibliothèque de types importés échoue

// *********************************************************************// 
// Interface: IComMotorCommands 
// Flags:  (4416) Dual OleAutomation Dispatchable 
// GUID:  {0D4E3A3F-0C07-438B-9F6F-CC1968408CFC} 
// *********************************************************************// 
    IComMotorCommands = interface(IDispatch) 
    ['{0D4E3A3F-0C07-438B-9F6F-CC1968408CFC}'] 
    function Get_ErrorFlag: WordBool; safecall; 
    function Get_ErrorMessageString: WideString; safecall;  
    function Get_ErrorNumber: Integer; safecall; 
    ... 
    end; 

... 

// *********************************************************************// 
// Interface: _ComMotorCommands 
// Flags:  (4432) Hidden Dual OleAutomation Dispatchable 
// GUID:  {5AB3EB9E-E847-3133-95DC-4DDC7870C02A} 
// *********************************************************************// 
    _ComMotorCommands = interface(IDispatch) 
    ['{5AB3EB9E-E847-3133-95DC-4DDC7870C02A}'] 
    end; 

... 

    CoComMotorCommands = class 
    class function Create: _ComMotorCommands; 
    class function CreateRemote(const MachineName: string): _ComMotorCommands; 
    end; 

J'ai aussi essayé de créer l'interface manuellement via

CreateComObject(CLASS_ComMotorCommands) as IComMotorCommandsDisp 

qui lui-même ne jette pas une exception. Même la définition de certaines propriétés de connexion, telles que le port et le débit en baud, semble fonctionner. Mais dès que j'essaie d'interroger l'état du moteur, j'obtiens

'BadImageFormatException: Une tentative a été faite pour charger un programme avec un format incorrect. (Exception de HRESULT: 0x8007000B) »,

esprit

vous, pas comme une exception dans ma demande, mais via le mécanisme de notification d'erreur de l'interface elle-même ( Get_ErrorMessageString).

Cette erreur indique généralement un conflit de bits entre les codes x86 et x64. Mais ma cible de plate-forme est x86, tout comme le SDK. Je cours Delphi XE3 sur Windows 7 x64, mais la même erreur est également apparue sur une machine 32 bits j'ai essayé, ce qui n'a aucun sens pour moi.

Le SDK propose également quelques exemples Visual Studio pour VB, C++ et C#. Mais tous utilisent la méthode Visual Studio pour appeler l'interface et ne sont d'aucune aide pour moi. (Là, vous référencez directement le TLB, déclarez simplement une variable de type 'ComMotorCommands' et pouvez accéder librement à toutes les méthodes d'interface.)

Je fournirai des fichiers complets sur demande par e-mail.

Je suis dans la tête ici, alors toute aide à ce sujet serait grandement appréciée!

+0

C'est peut-être un conflit de morsure. Exécutez le programme sous Dependency Viewer en mode de profil et voir quelle charge de module déclenche l'erreur. Ensuite, vérifiez ce module pour être 64 bits. –

+0

Merci David! Mais je ne suis pas tout à fait sûr de ce que vous entendez par "Dependency Viewer en mode profil". Pourriez-vous me montrer la bonne voie, s'il vous plaît? –

+0

Désolé. Ça s'appelle Dependency Walker. Recherche le sur Google. Chargez-le. Aller à l'élément de menu de profil. Sélectionnez votre exe. Et puis allez. Vous obtiendrez beaucoup de diagnostics et, espérons-le, isolerez le module qui ne se charge pas. –

Répondre

1

Le problème le plus probable est une tentative de chargement d'un module 64 bits. Déboguez ceci avec Dependency Walker en mode profil.

+0

Encore une fois, merci pour votre aide, David. J'étais capable de traquer une version 32 bits de rs485_com.dll. Maintenant, l'interface fonctionne à merveille! –

+0

Vous êtes les bienvenus et je suis heureux d'avoir été utile. –

Questions connexes