编组 LPSTR 和浮动时的不平衡堆栈

Posted

技术标签:

【中文标题】编组 LPSTR 和浮动时的不平衡堆栈【英文标题】:Unbalanced stack when marshalling LPSTR and float 【发布时间】:2012-10-02 17:29:53 【问题描述】:

我正在使用平台/调用,我正在尝试将浮点 LPSTR 和 int 编组到 c++ 函数,我收到以下错误:对 PInvoke 函数“Game!Game.Graphics::CreateModel”的调用不平衡堆。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。 这是我的 C# 代码:

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
        

以及c++函数的声明:

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;

提前感谢您的帮助。

【问题讨论】:

这是 CS 类和测试需要覆盖更多的问题。不是“如何处理这个假设的和完全不切实际的软件”。 【参考方案1】:

默认情况下,C++ 使用 __cdecl 作为调用约定,但 C# 默认使用 __stdcall。因此,您需要在 PInvoke 声明中指定这一点,即::

[DllImport(@"Graphics.dll", EntryPoint = "StartGL", CallingConvention=CallingConvention.Cdecl)]

【讨论】:

以上是关于编组 LPSTR 和浮动时的不平衡堆栈的主要内容,如果未能解决你的问题,请参考以下文章

堆栈平衡

如何验证 Gherkin 中的不平衡表?

调用 PInvoke 函数 ... 使堆栈不平衡

weka中的不平衡数据集?不工作

大型多类 NLP 分类的不平衡数据和样本量

使用 SMOTE 后导致高误报的不平衡数据集