2010-08-02 42 views
2

J'ai eu une rencontre prolongée avec la bête connue sous le nom COM Interop ...Problèmes d'utilisation Midl pour créer un .tlb de .idl « attend une spécification de type »

J'essaie actuellement de générer un .tlb à partir d'un fichier .idl généré par l'OLE/COM Object Viewer. Toutefois, lorsque vous essayez d'exécuter Midl.exe pour compiler je reçois une erreur:

.\Sim.API.IDL(236) : error MIDL2025 : syntax error : expecting a type s 
pecification near "ImportFileStatus" 

Mon fichier .idl est plus que 1000 lignes longues donc je ne veux pas particulièrement pour poster ici cependant, je crois que la partie il est intéressant:

typedef [uuid(980B172E-19C1-389A-BB74-29A54737C5B4), version(1.0) , 
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "Sim.API.ImportFileResult")  
] 
struct tagImportFileResult { 

    ImportFileStatus _status; 

    LPSTR _message; 
} ImportFileResult; 

Puis Plusieurs lignes plus loin ...

typedef [uuid(A4B9A0FF-A2D4-3EC5-AB7E-69311B9122C8), version(1.0) , 
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "Sim.API.ImportFileStatus")  
] 
enum { 
    ImportFileStatus_Success = 0, 
    ImportFileStatus_VersionMismatch = 1, 
    ImportFileStatus_Failure = 2 
} ImportFileStatus; 

Je sens que ceux-ci devraient être vénérés afin de corriger l'erreur de spécification de type. Cependant, si je fais cela, j'ai un nouveau problème.

midl\oleaut32.dll : warning MIDL2368 : error generating type library, ignored : 
Could not set UUID : tagImportFileResult (0x800288C6) 

Je suis assez familier avec le format IDL et avec l'utilisation de midl.exe, peut-être il y a quelque chose de façon flagrante de mal à ce que je fais?

Comme toujours toute aide serait grandement appréciée :)

Répondre

5

Vous avez raison, la permutation des déclarations est nécessaire pour maintenir MIDL heureux. En effet, OleView.exe ne générera pas de déclarations dans l'ordre original. Je pense qu'il les regroupe par genre, comme le type lib est organisé.

Le message que vous recevez est juste un avertissement, pas une erreur. Cela est dû à un alias pour le nom de la structure qui est différent. Vous pouvez l'ignorer en toute sécurité, car le code n'utilisera pas l'identificateur "tagImportFileResult". Mais vous pouvez vous en débarrasser en faisant le nom de la balise le même que le nom typedef:

typedef [..] 
    struct ImportFileResult { 
    //... 
} ImportFileResult; 

Voici un KB article sur le sujet.

+0

Merci Hans, je n'aurais jamais remarqué que la deuxième erreur était simplement un avertissement: P. Incidemment, y a-t-il une meilleure façon de générer des IDL qui ne change pas la commande? Connaissez-vous également d'autres ressources utiles pour COM Interop? Merci encore! – Jambobond

+2

Bien sûr, il suffit de demander à l'auteur original son fichier .idl. Vous obtiendrez une réponse possible sur deux: "pas de problème!" ou "vous plaisantez, c'est un logiciel protégé par des droits d'auteur, votre licence vous interdit expressément de le faire!". Ou vous n'entendrez jamais rien en arrière, pas improbable étant donné son âge probable. –

+1

En fait, je suis l'auteur original ^^ ou au moins mon entreprise est, Long histoire, mais c'est essentiellement pour contourner le problème «propput» plutôt que «propputref» lors de l'utilisation des propriétés de l'objet. Je dois donc générer et enregistrer le fichier .dll d'origine avec Regasm, puis éditer le fichier .IDL pour remplacer propputref par propput et enfin reconstruire le fichier tlb avec Midl. AMUSEMENT!!!! : P – Jambobond