从 C# 调用 C++ dll 中的 glutInit 时发生访问冲突

问题描述 投票:0回答:1

我正在尝试使用 C# 构建一个应用程序,以使 GUI 和 C++ 使用 OpenGL 进行渲染。我构建了一个 C++ dll 并尝试使用普通函数并且它有效。但是当我尝试创建一个调用 glut 指令的函数时,出现以下错误:

Project.exe 中的 0x100094D6 (glut32.dll) 处抛出异常:0xC0000005:读取位置 0x00000000 时发生访问冲突

这是 C# 代码:

  public class Program
    {
        public const string CppFunctions = @"..\..\..\Debug\Project2.dll";
        [DllImport(CppFunctions, CallingConvention = CallingConvention.Cdecl)]
        public static extern void nS();
#pragma warning restore CS0626 // Method, operator, or accessor is marked external and has no attributes on it
        [STAThread]
        static void Main()
        {
            nS();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            

        }
    }

和 C++ 代码:

#include <GL/glut.h>

#define func _declspec(dllexport)

void draw() {
    glClearColor(1, 1, 1, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
}

void sheet() {
    glutInit(0, NULL);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(80, 80);
    glutInitWindowSize(640, 480);
    glutCreateWindow("program");
    gluOrtho2D(0, 640, 0, 480);
    glutDisplayFunc(draw);
    glutMainLoop();
}
extern "C" {    
    func void nS() {
        sheet();
    }
}

当我运行此代码时,它会在 glut.h 中的以下行中中断:

static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
c# c++ opengl glut
1个回答
0
投票

glutInit
定义为
void glutInit(int *argcp, char **argv);
。请注意,它期望第一个参数中有一个指向整数的指针。由于您传入 0 (我认为应该是参数的数量),因此它被视为空指针,并且您会遇到访问冲突,因为 glut 尝试从此空指针读取。

尝试类似的事情

int argc = 0;
glutInit(&argc, NULL);
© www.soinside.com 2019 - 2024. All rights reserved.