0

構造体からデータを取得するためにDLLの関数を呼び出す方法に問題があります...

ライブラリがどのように機能するかについてのC++の例があり、vb.netで使用したい

さて、これは実際のc++の例です。

宣言:

BOOL (WINAPIV* MyFun)(DWORD start1, DWORD stop1, P_RESULT pResult, PDWORD pTpNum, myCALLBACK lpFunc) = NULL;

電話:

// pStruc = RESULT structure
// TrpNum1, TrpNum is ULONG

ULONG TrpNum1=0;
MyFun(Start,Stop,pStruc+TrpNum,&TrpNum1,&myCB);

折り返し電話:

void __stdcall myCB (RESULT *pStruc)
{
    printf ("%.3f", (double)pStruc->val1);
    tpn++;
}

そしてもちろん、構造:

typedef struct {
    BOOL            mybool;
    DWORD           val1;       
    DWORD           val2;       
} RESULT, *P_RESULT;

そしてこれは私のVB.netコードです(機能していません):

Public Declare Auto Function MyFun Lib "\mydll.dll" ( _
        ByVal start As UInt32, _
        ByVal stop As UInt32, _
        ByRef Result As RESULT, ByRef pTpNum As UInt32, ByVal lpFunc As DlgCB) As Boolean

Public Sub CallMyFun()
    Dim Res As New RESULT
    Dim TpN As UInt32

    If MyFun(100, 200, Res, TpN, AddressOf myCB) Then
        SendDebug("OK")

    Else
        SendDebug("Failed!")
    End If

End Sub

Public Delegate Function DlgCB(ByVal Res As RESULT) As Boolean

Public Function myCB(ByVal Res As RESULT) As Boolean
    Debug.Print(Res.val1)
    Return True
End Function

構造:

Public Structure RESULT
    Dim mybool As Boolean
    Dim val1 As UInt32
    Dim val2 As UInt32
End Structure

何が悪いの?

前もって感謝します。

編集:エラーは次のとおりです:「保護されたメモリの読み取りまたは書き込みを試みました。これは、他のメモリが破損していることを示していることがよくあります。」

また、コードで小さな「修正」を行います。それでも動作しません。

4

1 に答える 1

1

ここには多くの問題があります:

  • myBoolは整数であり、ブール値ではありません
  • Res変数は、ほぼ確実にローカル変数にすることはできません。フィールドにします。
  • TpNでも同じかもしれませんが、C++コードがポインタを格納しているかどうかは明確ではありません
  • どちらの場合も、C ++コードにポインターが格納されている場合は、オブジェクトを固定する必要があります。Marshal.AllocHGlobalで割り当てられたメモリに自分自身をマーシャリングする方がはるかに優れています
  • AddressOfで作成したデリゲートは、ガベージコレクションを取得します。発生しないように、フィールドに参照を保存する必要があります
  • コールバックは、ByValではなくパラメータByRefを宣言する必要があります
  • C ++コールバックは無効です。何らかの理由で、ブール値を返すようにしました。

これを実現するには、SOが提供できる範囲を少し超えた支援が必要です。経験豊富なチームメンバーに支援を求めるか、コンサルタントを雇ってください。

于 2012-04-16T12:33:51.547 に答える