2

このClarionプロシージャ宣言をC#に変換するにはどうすればよいですか?これは、Cで記述されたサードパーティのDLLの一部であり、ドキュメントはあまりありません。正しく機能しているClarionのメソッドのプロトタイプをリストしました。C#では、置換に使用するタイプがわかりません*CString。@DanielCが提案したように試しchar[]ましたが、うまくいきませんでした。また、Clarionlongが32ビットであることがわかりました(@ shf301に感謝)。

クラリオン:

SendRequest Procedure(*CString xData,Long DataLen,Long xTimeout),Byte,Virtual

C#(私が試したものですが、機能しません):

[DllImport("3RD_PARTY_API.dll")]
private static extern long SendRequest(ref string xData, int DataLen, int xTimeout);

SendRequestC#でメソッドを呼び出すと、 VS2010から標準のPInvokeStackImbalanceが検出されたというエラーが発生します。これはパラメータタイプの問題であり、DllImport宣言CharSetのようなものではないと思います。私は本当に有効なC#タイプに変換する方法に固執しています。EntryPoint*CString

4

4 に答える 4

6

私は答えを見つけました。このコードを書いた開発者と一緒に仕事をして、彼らに怒鳴ることができたらいいのにと思います。彼らはAPIの周りにラッパーを配置して、3つのパラメーターを使用してリストしたメソッドが、タイムアウト値なしで実際のAPIを呼び出すようにしました。PInvokeStackImbalance例外は、追加のパラメーターを追加していたという事実に起因していました。

実際のClarionプロシージャと、これに対する正しいC#構文は次のとおりです。

クラリオン:

SendRequest Procedure(*CString xData, Long DataLen), Byte, Virtual

C#:

[DllImport("NOVA_API.dll", EntryPoint = "SendRequest")]
private static extern byte SendRequest(string xData, int DataLen);

要約すると、ClarionはDLLImport宣言で*CString.NETタイプに変換できます。string

回答してくださった方々に感謝します。これが私の検索で使用した追加のリソースで、非常に便利であることがわかりました:pinvoke.net

于 2012-10-30T17:53:01.737 に答える
4

C#では、alongは常に64ビットです。クラリオンのLongは32ビットです。longp/Invoke宣言のパラメーターをint'sに変更します。

于 2012-10-29T23:35:23.037 に答える
2

ウィキペディアによると、クラリオンは、パラメーターに2つではなく4つのregを使用する奇妙なTopSpeed「ダブルファストコール」を使用できます。この呼び出し規約を使用してコードをコンパイルすると、C#から直接呼び出すことはできなくなります。

TopSpeed / Clarion / JPI最初の4つの整数パラメーターは、レジスタeax、ebx、ecx、およびedxで渡されます。浮動小数点パラメーターは、浮動小数点スタック(レジスタst0、st1、st2、st3、st4、st5、およびst6)で渡されます。構造パラメータは常にスタックに渡されます。レジスタが使い果たされた後、追加のパラメータがスタックに渡されます。整数値はeaxで返され、ポインターはedxで返され、浮動小数点型はst0で返されます。

そうでない場合は、おそらくパラメータの1つが適切なサイズではありません。そうでない場合は、破損したスタックエラーではなくAVが発生します。

dllimportで呼び出し規約を設定してみることもできます。「TOPSPEED」に加えて、クラリオンはstdcallとcdeclもサポートしますが、「TOPSPEED」がデフォルトです。以下は、vb6およびclarionとの相互運用に関するチュートリアルへのリンクです。

http://pisoft.ru/verstak/insider/cw_vb.htm

于 2012-10-30T11:27:23.987 に答える
1

試しましたchar[]か?それがうまくいくかどうかはわかりませんが、一見の価値があります。(コメントとして投稿しますが、権利はありません)

于 2012-10-29T22:14:12.070 に答える