2013-01-17 1 views
0

J'ai une interface COM définie dans le fichier IPlan.idl qui définit une propriété pour un tampon char * non signé.Marquage d'un char * non signé à partir d'une interface COM

[ 
    object, 
    uuid(...), 
    dual, 
    helpstring("..."), 
    pointer_default(unique) 
] 
interface IPlan : IDispatch 
{ 
    ... 
    [id(28), helpstring("method SetByte") 
    HRESULT SetByte([in] long index, [in] unsigned char buffer); 

    [id(29), helpstring("method GetByte") 
    HRESULT GetByte([in] long index, [out, retval] unsigned char * pBuffer); 

    [id(30), propget, helpstring("property Buffer")] 
    HRESULT Buffer([out, retval] unsigned char** pBuffer); 
    [id(30), propput, helpstring("property Buffer")] 
    HRESULT Buffer([in] unsigned char* newBuffer); 
    ... 
} 

Ma classe d'implémentation, MyPlan, est définie en C#. Cette classe parle à une classe COM C++, CProcessor. CProcessor calcule certaines données dans un tampon char * non signé. Ces données sont chargées dans un objet MyPlan une fois que toutes les données dans CProcessor ont été stockées dans son tampon.

Les métadonnées pour iPLAN définit les signatures de fonction suivantes:

public interface IPlan 
{ 
    ... 
    byte GetByte(int index); 
    void SetByte(int index, byte buffer); 
    IntPtr get_Buffer(); 
    void set_Buffer(ref byte pBuffer); 
    ... 
} 

Il est possible d'utiliser GetByte et SetByte de cProcessor pour accéder et modifier un byte [] variable dans myPlan. Je suis également capable d'utiliser get_Buffer() en rassemblant la variable byte [].

Ma question est de savoir comment puis-je utiliser la fonction

set_Buffer(ref byte pBuffer) 

? Quand je l'appelle dans CProcessor, pBuffer ne contient que le premier octet du buffer (comme un appel à SetByte (0, data)). Je suppose que j'ai besoin de rassembler le setter comme je l'ai fait dans le getter mais mes recherches sont apparues vides. J'ai essayé

set_Buffer([MarshalAs(UnmanagedType.LPStr)] ref byte pBuffer); 

mais cela ne semble pas faire quoi que ce soit à passer dans l'ensemble du tableau.

MarshalAs(UnmanagedType.LPStr) - how does this convert utf-8 strings to char*

Problem using dll in c#

Répondre

1

j'ai pu utiliser

[id(1), propget, helpstring("Buffer")] 
HRESULT Buffer([out, retval] VARIANT* pBuffer); 
[id(1), propput, helpstring("Buffer")] 
HRESULT Buffer([in] VARIANT pBuffer); 

pour passer un tableau non signé char de C++ C#. Le C# nécessite simplement une conversion en octets []

this.buffer = (byte[])myPlan.Buffer; 
Questions connexes