Golang CGO异常0x40010006

我正在尝试使用 cgo 从 dll 运行函数。该库是用 c++ 编写的,所以我在这里创建了一个 C 头文件,其中包含定义的函数和一个.cpp实现的文件。


库.h:


#ifdef __cplusplus

extern "C" {

#endif


void* LoadEngine(char*);


#ifdef __cplusplus

}

#endif


库.cpp:


#include <Engine.h> //the library


void* 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?


qq_笑_17
浏览 160回答 1
1回答

米琪卡哇伊

由于某些原因,在 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}#endifvoid* 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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go