Несбалансированный стек при маршаллинге LPSTR и float

Я использую платформу/вызов, и я пытаюсь маршалировать LPSTR с плавающей запятой и int в функцию С++, и я получаю следующую ошибку: вызов функции PInvoke 'Game!Game.Graphics::CreateModel' разбалансировал стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи. Вот мой код С#:

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
        }

и объявление функций С++:

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

Заранее благодарны за Вашу помощь.


person user1418638    schedule 02.10.2012    source источник
comment
Это тот тип вопросов, который необходимо охватить больше на курсах и тестах CS. Не то, как можно было бы поступить с этой гипотетической и совершенно непрактичной частью программного обеспечения.   -  person dialer    schedule 02.10.2012


Ответы (1)


По умолчанию C++ использует __cdecl для соглашения о вызовах, но C# по умолчанию использует __stdcall. Таким образом, вам нужно указать это в объявлении PInvoke, т.е.::

[DllImport(@"Graphics.dll", EntryPoint = "StartGL", CallingConvention=CallingConvention.Cdecl)]
person Reed Copsey    schedule 02.10.2012