1 回答

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
DllMain不能是 Go 函數(shù),因?yàn)榈谝淮握{(diào)用 Go 函數(shù)會(huì)初始化 Go 運(yùn)行時(shí),這在 的范圍內(nèi)是無(wú)法完成的(在 的范圍內(nèi)可以做的事情很少)。DllMainDllMain
作為一種解決方法,您可以使用 C 編寫(xiě)代碼,并在單獨(dú)的線(xiàn)程中調(diào)用 Go 代碼,如本示例所示。但是您無(wú)法在 的范圍內(nèi)與該線(xiàn)程同步,這樣做將再次導(dǎo)致死鎖。DllMainDllMain
還有_cgo_wait_runtime_init_done,但它也是異步的。
因此,如果您需要對(duì) DLL 附件同步執(zhí)行一些 Go 操作,那么您就不走運(yùn)了。最好只定義一個(gè)“”導(dǎo)出的函數(shù),并在調(diào)用任何其他 API 之前調(diào)用它。Init
當(dāng)然,Go 中在加載時(shí)初始化的慣用方式是通過(guò) init() 函數(shù):
package main
import "C"
import (
"fmt"
)
func init() {
fmt.Println("init()")
}
//export Test
func Test() {
fmt.Println("Test()")
}
func main() {
}
編譯并運(yùn)行:
go build -o mydll.dll --buildmode=c-shared
rundll32 mydll,Test
輸出:
init()
Test()
- 1 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報(bào)