|
|
|
package demo
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/forget-the-bright/go-dde/dde"
|
|
|
|
"github.com/forget-the-bright/go-dde/ddeml"
|
|
|
|
. "github.com/forget-the-bright/go-dde/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
func isHSZItem(hsz2 HSZ) HSZ {
|
|
|
|
for i := 0; i < len(items); i++ {
|
|
|
|
if ddeml.DdeCmpStringHandles(HSZ(hsz2), hszItem[i]) <= 0 {
|
|
|
|
return hszItem[i]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func DdeCallback(wType UINT, wFmt UINT, hConv HCONV, hsz1 HSZ, hsz2 HSZ, hData HDDEDATA, dwData1 ULONG_PTR, dwData2 ULONG_PTR) HDDEDATA {
|
|
|
|
selectItem := isHSZItem(hsz2)
|
|
|
|
var res HDDEDATA
|
|
|
|
switch wType {
|
|
|
|
case XTYP_CONNECT:
|
|
|
|
//接受客户端链接;
|
|
|
|
if ddeml.DdeCmpStringHandles(HSZ(hsz1), g_hszTopicName) <= 0 &&
|
|
|
|
ddeml.DdeCmpStringHandles(HSZ(hsz2), g_hszAppName) <= 0 {
|
|
|
|
res = HDDEDATA(TRUE)
|
|
|
|
} else {
|
|
|
|
res = HDDEDATA(FALSE) //接受客户端链接
|
|
|
|
}
|
|
|
|
case XTYP_ADVSTART:
|
|
|
|
//客户端启动咨询循环。
|
|
|
|
if ddeml.DdeCmpStringHandles(HSZ(hsz1), g_hszTopicName) <= 0 &&
|
|
|
|
ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 {
|
|
|
|
res = HDDEDATA(TRUE)
|
|
|
|
} else {
|
|
|
|
res = HDDEDATA(FALSE) //接受客户端链接
|
|
|
|
}
|
|
|
|
case XTYP_ADVREQ:
|
|
|
|
if ddeml.DdeCmpStringHandles(HSZ(hsz1), g_hszTopicName) <= 0 &&
|
|
|
|
ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 {
|
|
|
|
res = dde.DDESendMessage(idInst, "XTYP_ADVREQ", selectItem, UINT(wFmt))
|
|
|
|
}
|
|
|
|
//广播数据;
|
|
|
|
case XTYP_REQUEST:
|
|
|
|
if ddeml.DdeCmpStringHandles(HSZ(hsz1), g_hszTopicName) <= 0 &&
|
|
|
|
ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 {
|
|
|
|
res = dde.DDESendMessage(idInst, "XTYP_REQUEST哈哈", selectItem, UINT(wFmt))
|
|
|
|
}
|
|
|
|
//数据请求;
|
|
|
|
case XTYP_POKE:
|
|
|
|
if ddeml.DdeCmpStringHandles(HSZ(hsz1), g_hszTopicName) <= 0 &&
|
|
|
|
ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 {
|
|
|
|
message := dde.DDEGetMessage(hData)
|
|
|
|
fmt.Printf("message: %v\n", message)
|
|
|
|
res = HDDEDATA(DDE_FACK)
|
|
|
|
}
|
|
|
|
case XTYP_DISCONNECT:
|
|
|
|
fmt.Println("Disconnect notification received from server")
|
|
|
|
//接受客户端发送的数据;
|
|
|
|
default:
|
|
|
|
res = HDDEDATA(NULL)
|
|
|
|
}
|
|
|
|
return res
|
|
|
|
}
|
|
|
|
|
|
|
|
//var callbacks FNCALLBACK = DdeCallback
|
|
|
|
|
|
|
|
var idInst DWORD = 0
|
|
|
|
var szApp VString = "Server"
|
|
|
|
var szTopic VString = "MyTopic"
|
|
|
|
var g_hszAppName HSZ
|
|
|
|
var g_hszTopicName HSZ
|
|
|
|
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 runServer() {
|
|
|
|
iReturn := ddeml.DdeInitialize(&idInst, DdeCallback, DWORD(APPCLASS_STANDARD), 0)
|
|
|
|
if int(iReturn) != DMLERR_NO_ERROR {
|
|
|
|
fmt.Printf("DDE Initialization Failed")
|
|
|
|
}
|
|
|
|
g_hszAppName = ddeml.DdeCreateStringHandle(idInst, szApp, 0)
|
|
|
|
|
|
|
|
g_hszTopicName = ddeml.DdeCreateStringHandle(idInst, szTopic, 0)
|
|
|
|
for i := 0; i < len(items); i++ {
|
|
|
|
hszItem[i] = ddeml.DdeCreateStringHandle(idInst, items[i], 0)
|
|
|
|
}
|
|
|
|
sever := ddeml.DdeNameService(idInst, g_hszAppName, 0, UINT(DNS_REGISTER))
|
|
|
|
defer func() {
|
|
|
|
ddeml.DdeFreeStringHandle(idInst, g_hszAppName)
|
|
|
|
ddeml.DdeFreeStringHandle(idInst, g_hszTopicName)
|
|
|
|
fmt.Printf("服务端关闭")
|
|
|
|
ddeml.DdeNameService(idInst, g_hszAppName, 0, UINT(DNS_UNREGISTER))
|
|
|
|
ddeml.DdeUninitialize(idInst)
|
|
|
|
}()
|
|
|
|
if int(sever) < 1 {
|
|
|
|
fmt.Printf("DdeNameService() failed!")
|
|
|
|
}
|
|
|
|
fmt.Printf("服务端开启")
|
|
|
|
for {
|
|
|
|
//do something
|
|
|
|
var msg TagMSG
|
|
|
|
if int(ddeml.GetMessage(&msg, 0, 0, 0)) <= 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
ddeml.TranslateMessage(&msg)
|
|
|
|
ddeml.DispatchMessage(&msg)
|
|
|
|
}
|
|
|
|
}
|