C++ Golang CGO异常0x40010006

C++ Golang CGO异常0x40010006,c++,go,cgo,seh,C++,Go,Cgo,Seh,我正在尝试使用cgo从dll运行函数。库是C++的,所以我创建了一个C标头,这里定义了函数和一个 .CPP < /Cord>文件。 lib.h: \ifdef\uuucplusplus 外部“C”{ #恩迪夫 void*加载引擎(char*); #ifdef_uucplusplus } #恩迪夫 lib.cpp: #包括//库 void*加载引擎(char*sn){ 发动机*e; GetEngineObject(sn,&e);//来自dll的函数,在这里失败 返回(无效*)e; } 然后用以

我正在尝试使用cgo从dll运行函数。库是C++的,所以我创建了一个C标头,这里定义了函数和一个<代码> .CPP < /Cord>文件。 lib.h:

\ifdef\uuucplusplus
外部“C”{
#恩迪夫
void*加载引擎(char*);
#ifdef_uucplusplus
}
#恩迪夫
lib.cpp:

#包括//库
void*加载引擎(char*sn){
发动机*e;
GetEngineObject(sn,&e);//来自dll的函数,在这里失败
返回(无效*)e;
}
然后用以下方式称呼它:

主程序包
/*
#包括“lib.h”
*/
输入“C”
func main(){
e:=C.LoadEngine(C.CString(“foobar”)
...
}
我有
go1.12windows/amd64
mingw-w64-posix-seh

还尝试了
mingw-w64-posix-sjlj
mingw-w64-win32-seh
mingw-w64-win32-sjlj
,但结果相同,或者根本无法编译

只需使用
go build
和:

#cgo windows CFLAGS: -IC:/Engine/Inc
#cgo windows CPPFLAGS: -IC:/Engine/Inc
#cgo windows LDFLAGS: -LC:/Engine/Bin64 -lEngine -lEngineObj -lole32 -loleaut32 -luuid

在win8上它运行正常,但在win10+上它不工作,如果函数调用来自dll的
GetEngineObject
,它将失败:

Exception 0x40010006 0x1 0x8deb90 0x7ffbc9ada388
PC=0x7ffbc9ada388

runtime: unknown pc 0x7ffbc9ada388
stack: frame={sp:0x8dea80, fp:0x0} stack=[0x0,0x8dfdf0)
00000000008de980:  0000000002000002  000000002a080321
00000000008de990:  0000000090000191  0000000000000321
00000000008de9a0:  0000000500000008  0000000500000000
00000000008de9b0:  feeefeeefeeefeee  00000000024c0150
00000000008de9c0:  0000000000000000  0000000000000000
00000000008de9d0:  00000000024c0000  00007ffbccb730ac
00000000008de9e0:  0000000002680000  00000000024c1e30
00000000008de9f0:  00000000026a2d90  00000000026ad480
00000000008dea00:  0000000000000df1  0000000000000000
00000000008dea10:  0000000000000df1  0000000000000df1
00000000008dea20:  0000000000001bf8  0000000000000000
00000000008dea30:  0000000090000191  0000000000000003
00000000008dea40:  0000bcc3daf1f4cb  00000000026a2d00
00000000008dea50:  0000000000000000  000002fffb442d78
00000000008dea60:  0000000000000000  00000000008dfb00
00000000008dea70:  0000000000000020  00007ffbc9ada388
00000000008dea80: <00000000024c0000  000000002fbe1490
00000000008dea90:  00000000008df970  00000000ffffffff
00000000008deaa0:  0000000040010006  0000000000000000
00000000008deab0:  00007ffbc9ada388  0000000000000002
00000000008deac0:  0000000000000001  00000000008deb90
00000000008dead0:  00000000001b0150  0000000000800000
00000000008deae0:  00000000026ad480  0000000000000000
00000000008deaf0:  00000000001b10b0  0000000000690000
00000000008deb00:  00000000024c0000  00007ffbccbbcafa
00000000008deb10:  00000000024c0000  00007ffbccb76ff8
00000000008deb20:  00000000026a2d90  00000000026a9c30
00000000008deb30:  0000000000000000  0000000000000001
00000000008deb40:  00002c98037a65f6  000000000000001f
00000000008deb50:  00000000026a9430  000000002fd8a367
00000000008deb60:  0000000000006000  00000000024c0000
00000000008deb70:  0000000000000df1  0000000000000000
runtime: unknown pc 0x7ffbc9ada388
stack: frame={sp:0x8dea80, fp:0x0} stack=[0x0,0x8dfdf0)
00000000008de980:  0000000002000002  000000002a080321
00000000008de990:  0000000090000191  0000000000000321
00000000008de9a0:  0000000500000008  0000000500000000
00000000008de9b0:  feeefeeefeeefeee  00000000024c0150
00000000008de9c0:  0000000000000000  0000000000000000
00000000008de9d0:  00000000024c0000  00007ffbccb730ac
00000000008de9e0:  0000000002680000  00000000024c1e30
00000000008de9f0:  00000000026a2d90  00000000026ad480
00000000008dea00:  0000000000000df1  0000000000000000
00000000008dea10:  0000000000000df1  0000000000000df1
00000000008dea20:  0000000000001bf8  0000000000000000
00000000008dea30:  0000000090000191  0000000000000003
00000000008dea40:  0000bcc3daf1f4cb  00000000026a2d00
00000000008dea50:  0000000000000000  000002fffb442d78
00000000008dea60:  0000000000000000  00000000008dfb00
00000000008dea70:  0000000000000020  00007ffbc9ada388
00000000008dea80: <00000000024c0000  000000002fbe1490
00000000008dea90:  00000000008df970  00000000ffffffff
00000000008deaa0:  0000000040010006  0000000000000000
00000000008deab0:  00007ffbc9ada388  0000000000000002
00000000008deac0:  0000000000000001  00000000008deb90
00000000008dead0:  00000000001b0150  0000000000800000
00000000008deae0:  00000000026ad480  0000000000000000
00000000008deaf0:  00000000001b10b0  0000000000690000
00000000008deb00:  00000000024c0000  00007ffbccbbcafa
00000000008deb10:  00000000024c0000  00007ffbccb76ff8
00000000008deb20:  00000000026a2d90  00000000026a9c30
00000000008deb30:  0000000000000000  0000000000000001
00000000008deb40:  00002c98037a65f6  000000000000001f
00000000008deb50:  00000000026a9430  000000002fd8a367
00000000008deb60:  0000000000006000  00000000024c0000
00000000008deb70:  0000000000000df1  0000000000000000

goroutine 1 [syscall]:
path/to/package._Cfunc_LoadEngine(0x23a2c20, 0x0)
        _cgo_gotypes.go:518 +0x51
path/to/package.Load(0x4d05ad, 0x1d, 0x0, 0x0, 0x0)
        C:/Users/microo8/Documents/workspace/src/path/to/package/fre.go:55 +0x89
main.main()
        W:/Workspace/src/path/to/package/test/test.go:12 +0x41
rax     0x3e00003e
rbx     0x2fbe1490
rcx     0xfffffffffffffffe
rdi     0xffffffff
rsi     0x8df970
rbp     0x20
rsp     0x8dea80
r8      0x2fca2793
r9      0x3a0f4c0
r10     0x2fca2701
r11     0x26aadb0
r12     0x8dfb00
r13     0x0
r14     0x2fffb442d78
r15     0x0
rip     0x7ffbc9ada388
rflags  0x202
cs      0x33
fs      0x53
gs      0x2b
异常0x400100006 0x1 0x8deb90 0x7ffbc9ada388
PC=0x7ffbc9ada388
运行时:未知pc 0x7ffbc9ada388
堆栈:帧={sp:0x8dea80,fp:0x0}堆栈=[0x0,0x8DF0)
0000000000 8DE980:000000000 2000002 00000000 2A08321
0000000000 8DE990:00000000 90000191 0000000000000 321
0000000000 8DE9A0:0000000 5000000008 0000000 500000000
0000000000 8DE9B0:feeefeee 000000000 24C0150
0000000000 8DE9C0:0000000000000000000000000000
0000000000 8DE9D0:000000000 24C0000 00007ffbccb730ac
0000000000 8DE9E0:000000000 26800000 000000000 24C1E30
0000000000 8DE9F0:000000000 26A2D90 000000000 26AD480
0000000000 8DE100:0000000000000 DF1 0000000000000000
0000000000 8DEA10:0000000000000 DF1 0000000000000 DF1
0000000000 8DEA20:000000000000 1BF8 0000000000000000
0000000000 8DEA30:00000000 90000191 000000000000000 3
0000000000 8DEA40:0000bcc3daf1f4cb 000000000 26A2D00
0000000000 8DEA50:000000000000000002FFB442D78
0000000000 8DEA60:0000000000000000 0000000000 8DFB00
0000000000 8DEA70:00000000000000 20 00007ffbc9ada388

0000000000 8DEA80:由于某些原因,在win10+上,它将引发
DBG\u PRINTEXCEPTION\u C
。这是由
OutputDebugStringW
引起的,并且没有调试器正在侦听

我认为通常情况下,微软会这样做,但在MinGW中,它只是“try1”和“except1”,我认为它只适用于32位系统(很少有相关文档)

但我发现,你可以添加一个

现在lib.cpp:

#包括//库
#ifdef_WIN32
#包括
长WINAPI向量句柄(结构\u异常\u指针*ExceptionInfo){
未引用的_参数(ExceptionInfo);
返回异常\u CONTINUE\u EXECUTION;//继续
}
#恩迪夫
void*加载引擎(char*sn){
#ifdef_WIN32
PVOID handler=AddVectoredContinueHandler(1,VectoredHandler);
#恩迪夫
发动机*e;
GetEngineObject(序列号和e);
#ifdef_WIN32
RemoveVectoredContinueHandler(处理程序);
#恩迪夫
返回(无效*)e;
}

因为使用库从加载引擎开始,到卸载引擎结束,而引擎是一个单例,所以我刚刚将
PVOID处理程序
也设置为一个全局单例,
AddVectoredContinueHandler
位于
LoadEngine
中,
removvectoredcontinuehandler
位于
unoadengine
中> 由于某些原因,在win10+上,它会引发
DBG\u PRINTEXCEPTION\u C
。这是由
OutputDebugStringW
引起的,并且没有调试器正在侦听

我认为通常情况下,微软会这样做,但在MinGW中,它只是“try1”和“except1”,我认为它只适用于32位系统(很少有相关文档)

但我发现,你可以添加一个

现在lib.cpp:

#包括//库
#ifdef_WIN32
#包括
长WINAPI向量句柄(结构\u异常\u指针*ExceptionInfo){
未引用的_参数(ExceptionInfo);
返回异常\u CONTINUE\u EXECUTION;//继续
}
#恩迪夫
void*加载引擎(char*sn){
#ifdef_WIN32
PVOID handler=AddVectoredContinueHandler(1,VectoredHandler);
#恩迪夫
发动机*e;
GetEngineObject(序列号和e);
#ifdef_WIN32
RemoveVectoredContinueHandler(处理程序);
#恩迪夫
返回(无效*)e;
}

因为使用库从加载引擎开始,到卸载引擎结束,而引擎是一个单例,所以我刚刚将
PVOID处理程序
也设置为一个全局单例,
AddVectoredContinueHandler
位于
LoadEngine
中,
removvectoredcontinuehandler
位于
unoadengine
中>如果你有一个简单的C++程序,它调用了代码> GETEngEngtudio< /Cord>,它是工作的还是崩溃的?这个代码从哪里来?GETEngEngultObj/<代码>函数来自哪里?它能做什么?你能调试和修复它中的问题吗?我还没有从C++运行它,但是我可以试试。它是一个专有的库,我只是头和它做各种事情,不仅加载“引擎”,还通过许可证服务器检查许可证密钥(sn
param),初始化引擎(从磁盘加载一些数据),可能还有其他问题。我如何调试它?我可以使用Visual Studio,或者mingw的gdb吗?然后,如果崩溃在
GetEngineObject
中,您就不能真正调试它。您必须确保使用有效参数正确调用它,然后创建一个可以将错误报告发送给DLL制造商的程序。我可以尝试一下,但奇怪的是,它在win8上工作,在win10和win2016上产生相同的
异常0x40010006
DBG\u PRINTEXCEPTION\u C
).我尝试从C运行该函数。使用
g++
lib.cpp
编译为lib.o,并编写了
test.C
,其中我只从
lib.h调用
LoadEngine
函数