1

C# からサードパーティの DLL を呼び出そうとしていますが、一部の文字列データのマーシャリングに問題があります。DLL は Clarion で作成されたもので、使用されているデータ型についてはよくわかりません。具体的には、仕様には、機能しない関数の次の署名があります。

Bool QuerySoftwareVersion( cstring* version)  // edited documentation typo
//Returns Software version (20 character cstring).  

cstring は null で終わる文字列であると想定していましたがout char[] version、定義で動作させることができませんでした。これを処理する正しい方法を知っている人はいますか?

編集: 実際、これまでに発見したことは、Clarion の cstring が実際には null で終わる文字列であることを示唆しています。

更新: DLL ドキュメントにタイプミスがあることが判明したため、質問のタイトルと詳細を更新しました。問題のパラメーターは、 cstring ではなくtypeversionとして宣言されているように見えますが、明らかに c スタイルの null で終わる文字列です。したがって、マーシャリングはそれほど複雑ではないはずです。なぜなら、C 呼び出し規則で書かれていると彼らは主張しているからです。参照パラメーターを介して文字列を渡すクラリオン DLL を正常に p/invoke した人はいますか?cstring*cstringt*. And in Clarion,

4

3 に答える 3

0

クラリオンを呼び出したことはありませんが、クラリオンとC#の両方から呼び出されるDLL(C)があり、次のように相互運用します。

[DllImport("clarionlib.dll", CharSet=CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl,
ExactSpelling=true, EntryPoint="QuerySoftwareVersion")] static extern
            bool QuerySoftwareVersion(StringBuilder sName);

また、渡すStringBuilderパラメーターは、予想される最大の戻りサイズまでサイズ設定する必要があることにも注意してください(C#はご容赦ください、同等のものはもっと短いと思います)。

System.Text.StringBuilder buffer;
buffer = new System.Text.StringBuilder();
buffer.EnsureCapacity(21);
QuerySoftwareVersion(buffer);
string myString = buffer.ToString();
于 2009-07-01T23:11:17.933 に答える
0

DLL API の CString 参照である程度成功しました。

SCODE WINAPI Test( const CString& str );

次の C# コードを使用してインポートしました。

[DllImport("CBData.Dll")]
public static extern int Test( [MarshalAs(UnmanagedType.LPStr)] ref String str );

そして、次の C# コードを呼び出します。

String b = "Some text";
int x = Test(ref b);

これは私にとってはうまくいきました-これが安全かどうかはわかりません。これがお役に立てば幸いです。

于 2010-11-19T16:28:30.687 に答える
-1

StringBuilder で試してください。

[DllImport("mylibrary.dll")]
static extern bool QuerySoftwareVersion([Out] StringBuilder version);
于 2009-01-22T17:50:20.190 に答える