私は C++ (MSVC) ライターであり、VB の初心者であり、この作業を行ったことのない専門の VB.net ライターを支援しようとしています。
C/C++ と VB の両方のアプリケーションを開発して、C++ で記述された DLL と C の外部 API 関数を使用したいと考えています。C++ プログラムは正常に動作しています。私たちが問題を抱えているのはVBです。
DLL は次のextern C
機能を提供します。
RegisterCallback( void* cbFuncPtr, void* dataPtr );
注 1: デザインの変更とその理由については、以下のメモを参照してください。
注2:以下の回答として追加の更新が追加されました。
コールバック関数には、次の C 型定義があります。
typedef (void)(* CALL_NACK)(void*);
これcbFuncPtr
は、CALL_BACK として呼び出される VB 関数への関数ポインタであると予想されます。は、次のdataPtr
C 定義を持つデータ構造へのポインターです。
typedef struct
{
int retCode;
void* a_C_ptr;
char message[500];
} cbResponse_t;
どこにa_C_ptr is an internal pointer in the DLL that the VB can cast to
長い`。コールバックが作成された DLL 内の場所を一意に識別し、VB 関数が同じ場所または異なる場所からの呼び出しを認識できるようにします。
RegisterCallback()
VB から関数にアクセスして実行することができます。ロギングは、そこに到達し、データが渡されたことを示しています。問題のように見えるのは実際のデータです。
約 100 万件のフォーラム エントリを読んで、VB はポインタが何であるかを認識せず、VB の構造は単なる整理されたメモリ以上のものであることを学びました。VB 構造体の「アドレス」が、C がアドレスと考えるものではないことは確かです。「マーシャリング」と「管理されたデータ」への言及を繰り返し見てきましたが、それが何を伝えているのかを知るには十分な理解がありません。
コールバック関数の実行アドレスを DLL に与えるために VB をどのようにコーディングすればよいでしょうか? また、C++ の場合と同様に、DLL が埋めることができる VB 構造をどのようにコーディングすればよいでしょうか?
呼び出し元のアプリが "C" または "VB" と言うことができ、DLL が構造ポインターを別の方法で処理できるようにする DLL 関数が必要でしょうか? もしそうなら、どのように C をコード化して VB 構造を埋めますか?