0

今日、私は最初の DLL と、DLL を使用する最初のアプリケーションを作成しようとしました。

DLL は C++ で作成されており、これは私が呼び出しているコードです。

void Graph::findPath_r(Node* pStart, Node* pEnd, std::vector<cell> &road, cell &costMx)
{
//.....
    if(pEnd->getParent() != NULL)
    {
        while(!path.empty())
        {
            road.push_back(path.top()->getName());
            costMx += path.top()->getGCost();
            path.pop();
        }
        return;
    }
    return;
}
vector <int>tbcway;
int FUNCTION CalculatePath(int Start, int End, int * Array, int &cost)
{
    dgraph->findPath_r(xNode[Start].NodeID ,xNode[End].NodeID,tbcway,cost); 
    dgraph->reset();
    std::copy(tbcway.begin(), tbcway.end(), Array);
    tbcway.clear();
    return 1;
}

これは、VB.netで宣言して呼び出した方法です。

Imports System.Runtime.InteropServices

Public Class Form1

<DllImport("RCP.dll")> _
Public Shared Function LOAD_SYSTEM() As Boolean
End Function

<DllImport("RCP.dll")> _
Public Shared Function GetPluginVersion() As Integer
End Function

<DllImport("RCP.dll")> _
Public Shared Function CalculatePath(ByVal StartNode As Integer, ByVal EndNode As Integer, ByRef Array() As Array, ByRef cost As Integer) As Integer
End Function

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    LOAD_SYSTEM()
    MsgBox(GetPluginVersion().ToString())
    Dim path(4096) As Array
    Dim movecost As Integer
    CalculatePath(1702, 27932, path, movecost)
End Sub
End Class

では、このコードのどこが間違っているのでしょうか? 私が得ているエラーは次のとおりです。

PInvoke 関数 'RCP GUI!RCP_GUI.Form1::CalculatePath' の呼び出しにより、スタックのバランスが崩れています。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認します。

4

1 に答える 1

0

これはおそらく呼び出し規約の不一致です。

DllImport をさまざまな呼び出し規約でデコレートして、どれが機能するかを確認してください (私の推測では、cdecl である必要があります)。

于 2012-11-28T23:18:34.883 に答える