优化dde,创建结构体对象方法集成
parent
1a77b3c28b
commit
07d3998111
@ -0,0 +1,145 @@
|
||||
package demo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-dde/dde"
|
||||
"go-dde/ddeml"
|
||||
. "go-dde/types"
|
||||
"time"
|
||||
)
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue