0

Today I tried to make my first DLL and my first application which would use a DLL.

The DLL is made in C++ and this is the code I'm calling:

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;
}

and this is how I declared it in VB.net and called it:

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

So, what is wrong with this code? The error I am getting is:

A call to PInvoke function 'RCP GUI!RCP_GUI.Form1::CalculatePath' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

1 Answers1

0

This is probably a calling convention mismatch.

Try decorating your DllImport with different calling conventions to see which works (my guess is that it should be cdecl).

Rolf Bjarne Kvinge
  • 19,253
  • 2
  • 42
  • 86