I’m using platform/invoke and I’m trying to marshal floats LPSTRs and int to a c++ function and I get the following error: A call to PInvoke function ‘Game!Game.Graphics::CreateModel’ 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.
Here is my c# code:
public struct Graphics
{
[DllImport(@"Graphics.dll", EntryPoint = "StartGL")]
public static extern void StartGL();
[DllImport(@"Graphics.dll", EntryPoint = "CreateModel")]
public static extern void CreateModel([MarshalAs(UnmanagedType.LPStr)]string ModelPath, [MarshalAs(UnmanagedType.LPStr)]string TexturePath,float xposh, float yposh, float zposh, float rotAngleh, float xroth, float yroth, float zroth);
[DllImport(@"Graphics.dll", EntryPoint = "rotateModel")]
public static extern void rotateModel(int id,float rotAngle,float x, float y, float z);
}
class Program
{
static void Main(string[] args)
{
OpenGL();
}
static void OpenGL()
{
Graphics.CreateModel("box.obj","asd.png",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
Graphics.rotateModel(0,1.5707963267948966192313216916398f, 1.0f, 0.0f, 0.0f);
Graphics.StartGL();
//end of program
}
and the declaration of the c++ functions:
extern "C" __declspec(dllexport)void StartGL();
extern "C" __declspec(dllexport)void CreateModel(LPSTR ModelPath,LPSTR TexturePath,float xposh,float yposh,float zposh,float rotAngleh,float xroth,float yroth,float zroth)
{
m3Dobject mod = m3Dobject(ModelPath,TexturePath,xposh,yposh,zposh,rotAngleh,xroth,yroth,zroth);
Models.push_back(mod);
}
extern "C" __declspec(dllexport)void moveModel(int id,float x,float y,float z)
{
Models[id].xpos = x;
Models[id].ypos = y;
Models[id].zpos = z;
}
extern "C" __declspec(dllexport)void rotateModel(int id,float rotAnglef,float x,float y,float z)
{
Models[id].rotAngle = rotAnglef;
Models[id].xrot = x;
Models[id].yrot = y;
Models[id].zrot = z;
}
Thanks for your help in advance.
By default, C++ use
__cdeclfor the calling convention, but C# defaults to__stdcall. As such, you need to specify this in the PInvoke declaration, ie::