5

私は、考えられること、または提案されていることをすべて見て、見て、試しました。私はまだ必要なデータを取得できていません。

私はサードパーティの DLL を使用していますが、これは C で記述されていると思われます。C# でこの DLL から関数にアクセスする必要があります。ほとんどの場合、1 つの機能を除いて、これは機能しています。私が問題を抱えている機能には、次のヘッダーがあります。

uint queryNumOfServers(USHORT *NumOfServers, char ServerNames[8][16]);

C#アプリケーションで次のように宣言しています

[DllImport("client.dll", CharSet=CharSet.Ansi]
public static extern uint queryNumOfServers(ref short numberofServer, StringBuilder serverNames);

私はこれを次のように呼びます。

StringBuilder serverNames = new StringBuilder(128);
short numServers = -1;
queryNumberOfServers(ref numServers, serverNames);

問題は、numberOfServers が 4 に戻ってくるのに、serverNames で 1 つの名前しか得られないことです。上記の C 関数を小さな C プログラムでテストしました。numberOfServer = 4 が返されますが、4 つの名前も返されます。


次のことを試しましたが、成功しませんでした:

[DllImport("client.dll", CharSet=charSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint queryNumOfServers(ref short numberOfServer,[MarshalAs(UnmanagedType.LPStr)] string serverNames);

これを

string serverNames = new string('\0', 128);
queryNumOfServers(ref numServers, serverNames);

このオプションによる serverNames への変更はありません。


開発環境は Visual Studio 2008 です。

4

2 に答える 2

0

と を使用 [StructLayout(LayoutKind.Sequential...][MarshalAs(UnmanagedType.ByValTStr...]ます。

以下に 2 つの良い例を示します。

C 2 次元固定長文字配列のマーシャリング

構造体メンバーとしての C++ 2 次元固定長 char 配列のマーシャリング

于 2013-09-09T19:56:50.023 に答える