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
116 lines
2.9 KiB
Go
2 years ago
|
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()
|
||
|
}
|