次のことについて助けが必要です。私は C++ API (ソースへのアクセスなし) を持っていますが、char* 属性を返すメソッド、または char* 属性を含む構造体を返すことに苦労しています。API のドキュメントによると、戻り値は次のとおりです。
戻り値
関数が成功した場合、戻り値は、ホスト システム上のプロジェクトごとに 1 つずつ、2 番目の null 文字で終わる、一連の null で終わる文字列へのポインタです。<null>
次の例は、終端のヌル文字を表すバッファーの内容を示しています。
project1<null>project2<null>project3<null><null>
関数が失敗した場合、戻り値は NULL です
私が抱えている問題は、C# で返されたポインターに最初の値しか含まれていないことです...この場合は project1 です。管理された側でそれらをループできるように完全なリストを取得するにはどうすればよいですか?
C# コードは次のとおりです。
[DllImport("vmdsapi.dll", EntryPoint = "DSGetProjectList", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr DSGetProjectList();
呼び出し方法:
IntPtr ptrProjectList = DSAPI.DSGetProjectList(); string strProjectList = Marshal.PtrToStringAnsi(ptrProjectList).ToString();
strProjectList には最初の項目のみが含まれます。
APIのヘッダーファイルからの情報は次のとおりです...
DllImport char *DSGetProjectList dsproto((void));
これは、テスト目的で使用した C++ コンソール アプリのサンプル コードです...
char *a; a = DSGetProjectList( ); while( *a ) { printf("a=%s\n", a); a += 1 + strlen(a); }
各反復により、リスト内のすべてのプロジェクトが正しく表示されます。