You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.9 KiB
Go

package main
import (
"fmt"
dde "go-dde/ddeml"
. "go-dde/types"
"time"
"unsafe"
)
const (
MAX_BUFFER_SIZE = 16
)
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
}
func DDERequest(idInst DWORD, hConv HCONV, hszItem HSZ, sDesc string) string {
hData := dde.DdeClientTransaction(nil, 0, hConv, hszItem, UINT(CF_TEXT),
UINT(XTYP_REQUEST), 5000, nil)
if hData == 0 {
return "Request failed"
} else {
size := dde.DdeGetData(hData, nil, 0, 0)
var str BYTE
dde.DdeGetData(hData, &str, size, 0)
buffer := (*[MAX_BUFFER_SIZE]byte)(unsafe.Pointer(&str))[:size-1]
//szResult := *(*[]byte)(unsafe.Pointer(&str))
return string(buffer)
}
}
func DDEPoke(idInst DWORD, hConv HCONV, hszItem HSZ, szData string) {
var data []byte = []byte(szData)
dde.DdeClientTransaction((unsafe.Pointer(&data)),
DWORD(len(data)+1),
hConv, hszItem, UINT(CF_TEXT),
UINT(XTYP_POKE), 3000, nil)
}
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() {
// AddApis(dde.DdeApis)
// AddApis(dde.DdeANSIApis)
// AddApis(dde.DdeUnicodeApis)
var cmd DWORD = DWORD(APPCLASS_STANDARD | APPCMD_CLIENTONLY)
var res DWORD = 0
iReturn := dde.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 := dde.DdeCreateStringHandle(idInst, szApp, 0)
hszTopic := dde.DdeCreateStringHandle(idInst, szTopic, 0)
for i := 0; i < len(items); i++ {
hszItem[i] = dde.DdeCreateStringHandle(idInst, items[i], 0)
}
hConv = dde.DdeConnect(idInst, hszApp, hszTopic, nil)
dde.DdeFreeStringHandle(idInst, hszApp)
dde.DdeFreeStringHandle(idInst, hszTopic)
if hConv == 0 {
fmt.Printf("DDE Connection Failed.\n")
time.Sleep(2e9) //2e9 相当于2秒
dde.DdeUninitialize(idInst)
}
for i := 0; i < len(items); i++ {
data := DDERequest(idInst, hConv, hszItem[i], "请求到服务端数据: ")
fmt.Printf("data: %v\n", data)
DDEPoke(idInst, hConv, hszItem[i], data)
time.Sleep(1e9)
}
fmt.Printf("客户端关闭")
dde.DdeDisconnect(hConv)
dde.DdeUninitialize(idInst)
}
func main() {
runClient()
}