为了账号安全,请及时绑定邮箱和手机立即绑定

Golang CGO异常0x40010006

Golang CGO异常0x40010006

Go
qq_笑_17 2023-06-12 14:34:35
我正在尝试使用 cgo 从 dll 运行函数。该库是用 c++ 编写的,所以我在这里创建了一个 C 头文件,其中包含定义的函数和一个.cpp实现的文件。库.h:#ifdef __cplusplusextern "C" {#endifvoid* LoadEngine(char*);#ifdef __cplusplus}#endif库.cpp:#include <Engine.h> //the libraryvoid* LoadEngine(char *sn) {  Engine *e;  GetEngineObject(sn, &e); //function from the dll, here it fails  return (void*) e;}然后调用它:package main/*#include "lib.h"*/import "C"func main() {  e := C.LoadEngine(C.CString("foobar")  ...}我有go1.12 windows/amd64 和mingw-w64-posix-seh也试过mingw-w64-posix-sjlj, mingw-w64-win32-seh, mingw-w64-win32-sjlj, 但结果是一样的, 或者根本不编译用go buildand 编译它:#cgo windows CFLAGS: -IC:/Engine/Inc#cgo windows CPPFLAGS: -IC:/Engine/Inc#cgo windows LDFLAGS: -LC:/Engine/Bin64 -lEngine -lEngineObj -lole32 -loleaut32 -luuid我也尝试用 mingw 捕获异常__try1,__except1但无论如何它都失败了。尝试了不同的 mingw 版本,使用-ldflags="-linkmode internal"但是这不会编译并且-ldflags="-linkmode external"也会出现此异常。编辑:还尝试从 C 程序调用LoadEngine函数 (from ),它工作正常。lib.h编译lib.cpp为. g++_ lib.o并将它链接到test.c我刚刚调用LoadEnginejust frommain函数的地方。所以也许有什么不对劲怎么把库链接到cgo?
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

由于某些原因,在 win10+ 上它会提高DBG_PRINTEXCEPTION_C. 这是由OutputDebugStringW没有调试器正在侦听引起的。

我认为通常它会用微软的__try 和 __except来完成,但在 MinGW 中只有 __try1 和 __except1,我认为它们只适用于 32 位系统(很少有相关文档)

但我发现,你可以添加一个异常处理程序

所以现在 lib.cpp:

#include <Engine.h> //the library

#ifdef _WIN32

#include <windows.h>


LONG WINAPI VectoredHandler(struct _EXCEPTION_POINTERS *ExceptionInfo) {

   UNREFERENCED_PARAMETER(ExceptionInfo);  

   return EXCEPTION_CONTINUE_EXECUTION;  //just continue

}

#endif



void* LoadEngine(char *sn) {

#ifdef _WIN32

  PVOID handler = AddVectoredContinueHandler(1, VectoredHandler);

#endif

  Engine *e;

  GetEngineObject(sn, &e);

#ifdef _WIN32

  RemoveVectoredContinueHandler(handler); 

#endif

  return (void*) e;

}

因为使用该库以加载引擎开始并以卸载它结束,并且引擎是一个单例,所以我刚刚将 also 设为PVOID handler全局单例并且AddVectoredContinueHandleris inLoadEngine和RemoveVectoredContinueHandleris in UnloadEngine。


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信