我正在尝试使用 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); }
glutInit
定义为 void glutInit(int *argcp, char **argv);
。请注意,它期望第一个参数中有一个指向整数的指针。由于您传入 0 (我认为应该是参数的数量),因此它被视为空指针,并且您会遇到访问冲突,因为 glut 尝试从此空指针读取。
尝试类似的事情
int argc = 0;
glutInit(&argc, NULL);