我想加載自定義 DLL(C++ 之一)并調用它導出的函數?這是我的代碼:func main() { dllForGo := syscall.MustLoadDLL("dllForGo.dll") defer dllForGo.Release() getHello:= dllForGo.MustFindProc("getHello") r1, _, err := getHello.Call(0) // also tried with .Call() and still got the same error}這是我的 DLL 的 C++ 代碼: std::string __stdcall getHello(void) { int a = 1; double b = 10; return ("Hello-World !!"+std::to_string(a) + std::to_string(b));}我試圖強制使用 __stdcall(并為此鏈接一個 .def 文件,因為我認為 __declspec(dllexport) 可能是個問題)。但是,使用 DUMPBIN,我可以看到 getHello 使用 __cdecl 調用約定。這是個問題嗎?這是我運行 Go 時遇到的錯誤:Exception 0xc0000005 0x1 0x10 0x7fef0591327PC=0x7fef0591327syscall.Syscall(0x7fef05910d0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) D:/Go/src/runtime/syscall_windows.go:172 +0xf9syscall.(*Proc).Call(0xc00004e420, 0xc000058090, 0x1, 0x1, 0x565520, 0x21, 0x2e06a0, 0x0) D:/Go/src/syscall/dll_windows.go:146 +0x140main.main() D:/GoLand_Projects/dllLoad/main.go:58 +0x335rax 0x22fdb8rbx 0x9rcx 0x30rdi 0x9rsi 0x0rbp 0x22fdd9rsp 0x22fd60r8 0x30303030302e3031r9 0x7fef1220000r10 0x22fd90r11 0x771a1fr12 0xar13 0x9r14 0x0r15 0x0rip 0x7fef0591327rflags 0x10202cs 0x33fs 0x53gs 0x2b
1 回答

一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
答案:
使用對象很棘手。string 是一個對象,它可能在某個地方有一個 vtable,它也有一個內部結構(雖然我忘了它是什么,我猜它類似于 COM bstring 或 go slice,也許檢查相關的 c++ 源)。調用方法將涉及查找整個調度表的地址并將它們作為函數調用。我建議您從 C char * 開始,然后按照自己的方式進行。
所以我嘗試將 char ** 作為參數,我可以在 DLL 函數中修改它并在 Go 中顯示修改。我也嘗試返回一個基本類型(int)并且它也有效。
- 1 回答
- 0 關注
- 234 瀏覽
添加回答
舉報
0/150
提交
取消