0

unsigned char* バッファのプロパティを定義するファイル IPlan.idl で定義された 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);
    ...
}

私の実装クラス MyPlan は C# で定義されています。このクラスは、C++ COM クラスである CProcessor と対話します。CProcessor は、一部のデータを unsigned char* バッファーに計算します。このデータは、CProcessor 内のすべてのデータがそのバッファーに格納されると、MyPlan オブジェクトに読み込まれます。

IPlan のメタデータは、次の関数シグネチャを定義します。

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

CProcessor から GetByte と SetByte を使用して、MyPlan の byte[] 変数にアクセスして変更できます。byte[] 変数をマーシャリングして get_Buffer() を使用することもできます。

私の質問は、どのように利用できるかです

set_Buffer(ref byte pBuffer)

関数?CProcessor で呼び出すと、pBuffer にはバッファーの最初のバイトのみが含まれます (SetByte(0, data) の呼び出しのように)。ゲッターで行ったのと同じようにセッターをマーシャリングする必要があると思いますが、検索が空になりました。私が試してみました

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

しかし、それは配列全体を渡すために何もしていないようです。

MarshalAs(UnmanagedType.LPStr) - utf-8 文字列を char* に変換する方法

c#でdllを使用する際の問題

4

1 に答える 1

1

使えました

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

unsigned char 配列を C++ から C# に渡します。C# は byte[] へのキャストを必要とするだけです

this.buffer = (byte[])myPlan.Buffer;
于 2013-11-07T17:30:28.713 に答える