2010-01-11 3 views
0

J'ai une déclaration d'interface comme ceci:Com Interop Ordre des déclarations

[ComImport] 
[Guid("79EAC9E4-BAF9-11CE-8C82-00AA004BA90B")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IInternetProtocol { 
    //IInternetProtcolRoot 
    void Start(
     [ MarshalAs(UnmanagedType.LPWStr) ] string szURL, 
     IInternetProtocolSink Sink, 
     IInternetBindInfo pOIBindInfo, 
     UInt32 grfPI, 
     UInt32 dwReserved); 
    void Continue(ref _tagPROTOCOLDATA pProtocolData); 
    void Abort(Int32 hrReason, UInt32 dwOptions); 
    void Terminate(UInt32 dwOptions); 
    void Suspend(); 
    void Resume(); 
    //IInternetProtocol 
    [PreserveSig()] UInt32 Read(IntPtr pv, UInt32 cb, out UInt32 pcbRead); 
    void Seek(_LARGE_INTEGER dlibMove, UInt32 dwOrigin, out _ULARGE_INTEGER plibNewPosition); 
    void LockRequest(UInt32 dwOptions); 
    void UnlockRequest(); 
} 

L'objet qui implémente cette interface est censé avoir sa méthode Start appelé. Cependant, cela ne se produit pas. Mais curieusement, je trouve que la méthode Terminate est appelée à la place, et si je place un point d'arrêt sur la méthode Terminate, puis que j'observe le paramètre dwOptions, il contient en fait un IntPtr qui peut être converti en une chaîne contient ce qui serait le premier paramètre à démarrer. Je suppose que cela a quelque chose à voir avec l'ordre de déclaration, même si la déclaration ci-dessus est la déclaration canonique que j'ai vue partout.

De plus, je trouve que si j'ajouter des arguments de IntPtr arbitraires à la définition de Terminate il ressemble à ceci:

Terminate(IntPtr a1, IntPtr a2, IntPtr a3, IntPtr a4, IntPtr a5, IntPtr a6) 

la méthode est toujours en cours avec succès appelé à la chaîne comme un pointeur dans a1 et d'autres les champs étant remplis avec 130 ou ce qui ressemble à une autre adresse de mémoire.

Une idée de ce qui se passe ici? La méthode Start prend seulement 5 paramètres. Pourtant, ici, j'ai déclaré Terminate avec 6 et son étant encore appelé à l'endroit où Start devrait être appelé.

Répondre

1

Assurez-vous que les identifiants d'expédition (dispid) sont définis correctement en comparant l'encapsulable appelable généré avec le fichier IDL.

1

Vous avez oublié les 3 méthodes IUnknown. IInternetProtocolRoot :: Start() est la 4ème méthode de la vtable.

+0

Intéressant. Mais je lis ici http://msdn.microsoft.com/en-us/library/aa645736(VS.71).aspx que vous n'incluez pas les membres IUnknown et IDispatch dans la déclaration. Je suis assez sûr que je fais quelque chose de fondamentalement faux ici ... –

+0

Cet article traite de la prise en charge COM Interop standard intégrée au CLR. Vous semblez faire votre propre avec [ComImport]. –