亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 DLL 的導出函數中獲取 std::string?

如何從 DLL 的導出函數中獲取 std::string?

Go
明月笑刀無情 2023-06-01 09:51:51
我想加載自定義 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)并且它也有效。


查看完整回答
反對 回復 2023-06-01
  • 1 回答
  • 0 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號