package main import ( "fmt" "go-dde/dde" "go-dde/ddeml" . "go-dde/types" "time" ) func DdeCallback(wType int, wFmt int, hConv uintptr, hsz1 uintptr, hsz2 uintptr, hData uintptr, dwData1 int64, dwData2 int64) int { switch wType { case XTYP_CONNECT: //接受客户端链接; return 0 //接受客户端链接 case XTYP_ADVSTART: //客户端启动咨询循环。 return 0 //接受客户端链接 case XTYP_ADVREQ: //广播数据; case XTYP_REQUEST: //数据请求; case XTYP_POKE: //接受客户端发送的数据; default: return 0 } return 0 } var callbacks FNCALLBACK = func( Type UINT, Fmt UINT, Conv HCONV, Sz1 HSZ, Sz2 HSZ, Data HDDEDATA, Data1 ULONG_PTR, Data2 ULONG_PTR) HDDEDATA { return 0 } var idInst DWORD = 0 var szApp VString = "Server" var szTopic VString = "MyTopic" var items []VString = []VString{"MyItem0", "MyItem1", "MyItem2", "MyItem3", "MyItem4", "MyItem5", "MyItem6"} var hszItem []HSZ = make([]HSZ, len(items)) func runClient() { var cmd DWORD = DWORD(APPCLASS_STANDARD | APPCMD_CLIENTONLY) var res DWORD = 0 iReturn := ddeml.DdeInitialize(&idInst, DdeCallback, cmd, res) if iReturn != UINT(DMLERR_NO_ERROR) { } if int(iReturn) != DMLERR_NO_ERROR { fmt.Printf("DDE Initialization Failed") } var hConv HCONV // 会话句柄 hszApp := ddeml.DdeCreateStringHandle(idInst, szApp, 0) hszTopic := ddeml.DdeCreateStringHandle(idInst, szTopic, 0) for i := 0; i < len(items); i++ { hszItem[i] = ddeml.DdeCreateStringHandle(idInst, items[i], 0) } hConv = ddeml.DdeConnect(idInst, hszApp, hszTopic, nil) ddeml.DdeFreeStringHandle(idInst, hszApp) ddeml.DdeFreeStringHandle(idInst, hszTopic) if hConv == 0 { fmt.Printf("DDE Connection Failed.\n") time.Sleep(2e9) //2e9 相当于2秒 ddeml.DdeUninitialize(idInst) } for i := 0; i < len(items); i++ { data := dde.DDERequest(idInst, hConv, hszItem[i], "请求到服务端数据: ") fmt.Printf("data: %v\n", data) dde.DDEPoke(idInst, hConv, hszItem[i], data) time.Sleep(1e9) } fmt.Printf("客户端关闭") ddeml.DdeDisconnect(hConv) ddeml.DdeUninitialize(idInst) } func main() { runClient() }