0

C dll を呼び出す C# コードがあります。dll には、次の文字列のグローバル const 配列があります。

const char *PtxEditorColumnHeaders[] = {
    "Ptx#",
    "Primitive",
    "PtxType",
    "_END_COLUMNS"
};

私がやりたいことは、このテキストを取得して、ListView コントロールの列テキストに挿入することだけです。Pinvoke、strcpy などを使用して、これを行うにはいくつかの方法があることがわかりました。

4

1 に答える 1

-1

配列の最初の要素へのポインターと要素の数を返す C 関数を作成します。

const char **GetPtxEditorColumnHeaders(int *count)
{
    *count = 4;//or however you want to get hold of this information
    return PtxEditorColumnHeaders;
}

そして、p/invoke を宣言します。

[DllImport(@"mydll.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr GetPtxEditorColumnHeaders(out int count);

次のように関数を呼び出します。

int count;
IntPtr PtxEditorColumnHeaders = GetPtxEditorColumnHeaders(out count);
List<string> headers = new List<string>();
for (int i=0; i<count; i++)
{
    IntPtr strPtr = Marshal.ReadIntPtr(PtxEditorColumnHeaders);
    headers.Add(Marshal.PtrToStringAnsi(strPtr));
    PtxEditorColumnHeaders += Marshal.SizeOf(typeof(IntPtr));
}

この作業はすぐに面倒になり、その時点で C++/CLI ラッパーがより魅力的なオプションのように見え始めます。

于 2012-07-11T19:53:32.347 に答える