3

私は化学の博士号を取得しようとしています。そのため、顕微鏡下でのサンプルのイメージングに役立つソフトウェア アプリケーションを作成する必要があります。この顕微鏡には、xyz ナノポジショニング ステージが取り付けられています。ステージは、ハードウェア ベンダーによって VC++ で記述されたアンマネージ DLL を使用して制御されます。必要なものの詳細を提供できますが、まずはこれから始めましょう。

dll のメソッドの 1 つを使用すると、運動軸の設定を読み取ることができます。

C++ 構文:

BOOL E7XX_qSVO (int ID, const char* szAxes, BOOL* pbValueArray) 

BOOL は、規則に従って int 0 または 1 です。

私のC#ラッパーには以下が含まれています:

[DllImport("E7XX_GCS_DLL.dll", EntryPoint = "E7XX_qSVO")]   
public static extern int qSVO(int iId, string sAxes, int []iValArray);

これは私には正しいようです。ただし、メインアプリケーションで次のようなことを試すと(軸1、2、および3を照会するため):

Int32 [] _iValues = new Int32[3];
E7XXController.qSVO(m_iControllerID, "123", _iValues);

私は一貫して次のような配列を取得します:

{6, 0, 10} ですが、デバイス自体の表示に従って {0, 0 , 0} を取得する必要があります。補完機能:

BOOL E7XX_SVO (int ID, const char* szAxes, const BOOL* pbValueArray)ステージに同じステータスビットを設定することもできません...

dll の他のコマンドは完全に機能します。問題なく文字列とダブルスを出し入れできますが、BOOL型は受け渡しできません...

何が悪いのか分かりますか?

4

4 に答える 4

1

C++ の BOOL は実際には「int」であるため、System.Boolean ではなく System.Int32 を使用してください。または、VARIANT_BOOL などの COM データ型を使用している可能性があります。この場合、System.Boolean が必要です。関数プロトタイプを確認するために、依存関係ビューアーを実行してみましたか?

于 2009-01-31T22:21:18.063 に答える
0

関数のドキュメントには次のように書かれています。

VC++ コンパイラには、extern "C" 修飾子が必要です。宣言では、これらの関数が標準の Win-API 関数のように呼び出されることも指定する必要があります。つまり、VC++ コンパイラは、宣言で WINAPI または __stdcall 修飾子を確認する必要があります。

のデフォルトの呼び出し規約DllImportWinApiです。Windows では、それは StdCall です。しかし CE では、それは Cdecl です。正しい呼び出し規約を使用していることを確認する必要があります。以下を追加してトレイに入れたいと思うかもしれません:

CallConvention = CallingConvention.StdCall

また、文字列の文字セットを指定します。

CharSet = CharSet.Ansi

しかし、これらがなくても機能するはずです。コードが正しく見えるのはかなり奇妙です。

于 2009-02-01T02:46:54.283 に答える