修改客户端实现完成

master
15128022404 2 years ago
parent e3258516ed
commit d6deeebed3

@ -0,0 +1,39 @@
package dde
/*
#include <stdio.h>
#include <stdlib.h>
*/
import "C"
import (
ddeml "go-dde/ddeml"
. "go-dde/types"
"unsafe"
)
const (
MAX_BUFFER_SIZE = 16
)
func DDERequest(idInst DWORD, hConv HCONV, hszItem HSZ, sDesc string) string {
hData := ddeml.DdeClientTransaction(nil, 0, hConv, hszItem, UINT(CF_TEXT),
UINT(XTYP_REQUEST), 5000, nil)
if hData == 0 {
return "Request failed"
} else {
size := ddeml.DdeGetData(hData, nil, 0, 0)
var str BYTE
ddeml.DdeGetData(hData, &str, size, 0)
buffer := (*[MAX_BUFFER_SIZE]byte)(unsafe.Pointer(&str))[:size-1]
return string(buffer)
}
}
func DDEPoke(idInst DWORD, hConv HCONV, hszItem HSZ, szData string) {
cs := C.CString(szData)
ddeml.DdeClientTransaction((*BYTE)(unsafe.Pointer(cs)),
DWORD(len(szData)+1),
hConv, hszItem, UINT(CF_TEXT),
UINT(XTYP_POKE), 3000, nil)
C.free(unsafe.Pointer(cs))
}

@ -2,7 +2,6 @@ package ddeml
import ( import (
. "go-dde/types" . "go-dde/types"
"unsafe"
) )
var ( var (
@ -59,7 +58,7 @@ var (
Inst DWORD, S1 HSZ, S2 HSZ, Cmd UINT) HDDEDATA Inst DWORD, S1 HSZ, S2 HSZ, Cmd UINT) HDDEDATA
DdeClientTransaction func( DdeClientTransaction func(
Data unsafe.Pointer, //*BYTE Data *BYTE, //*BYTE
cData DWORD, cData DWORD,
Conv HCONV, Conv HCONV,
Item HSZ, Item HSZ,

@ -139,7 +139,7 @@ func init() {
} }
DdeClientTransaction = func( DdeClientTransaction = func(
Data unsafe.Pointer, //*BYTE Data *BYTE, //*BYTE
cData DWORD, cData DWORD,
Conv HCONV, Conv HCONV,
Item HSZ, Item HSZ,
@ -149,7 +149,7 @@ func init() {
Result *DWORD) HDDEDATA { Result *DWORD) HDDEDATA {
proc := user32.MustFindProc("DdeClientTransaction") proc := user32.MustFindProc("DdeClientTransaction")
res, _, _ := proc.Call( res, _, _ := proc.Call(
uintptr(Data), uintptr(unsafe.Pointer(Data)),
uintptr(cData), uintptr(cData),
uintptr(Conv), uintptr(Conv),
uintptr(Item), uintptr(Item),

@ -2,14 +2,10 @@ package main
import ( import (
"fmt" "fmt"
dde "go-dde/ddeml" "go-dde/dde"
"go-dde/ddeml"
. "go-dde/types" . "go-dde/types"
"time" "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 { func DdeCallback(wType int, wFmt int, hConv uintptr, hsz1 uintptr, hsz2 uintptr, hData uintptr, dwData1 int64, dwData2 int64) int {
@ -44,28 +40,6 @@ var callbacks FNCALLBACK = func(
return 0 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 idInst DWORD = 0
var szApp VString = "Server" var szApp VString = "Server"
var szTopic VString = "MyTopic" var szTopic VString = "MyTopic"
@ -73,12 +47,9 @@ var items []VString = []VString{"MyItem0", "MyItem1", "MyItem2", "MyItem3", "MyI
var hszItem []HSZ = make([]HSZ, len(items)) var hszItem []HSZ = make([]HSZ, len(items))
func runClient() { func runClient() {
// AddApis(dde.DdeApis)
// AddApis(dde.DdeANSIApis)
// AddApis(dde.DdeUnicodeApis)
var cmd DWORD = DWORD(APPCLASS_STANDARD | APPCMD_CLIENTONLY) var cmd DWORD = DWORD(APPCLASS_STANDARD | APPCMD_CLIENTONLY)
var res DWORD = 0 var res DWORD = 0
iReturn := dde.DdeInitialize(&idInst, DdeCallback, cmd, res) iReturn := ddeml.DdeInitialize(&idInst, DdeCallback, cmd, res)
if iReturn != UINT(DMLERR_NO_ERROR) { if iReturn != UINT(DMLERR_NO_ERROR) {
} }
@ -86,28 +57,28 @@ func runClient() {
fmt.Printf("DDE Initialization Failed") fmt.Printf("DDE Initialization Failed")
} }
var hConv HCONV // 会话句柄 var hConv HCONV // 会话句柄
hszApp := dde.DdeCreateStringHandle(idInst, szApp, 0) hszApp := ddeml.DdeCreateStringHandle(idInst, szApp, 0)
hszTopic := dde.DdeCreateStringHandle(idInst, szTopic, 0) hszTopic := ddeml.DdeCreateStringHandle(idInst, szTopic, 0)
for i := 0; i < len(items); i++ { for i := 0; i < len(items); i++ {
hszItem[i] = dde.DdeCreateStringHandle(idInst, items[i], 0) hszItem[i] = ddeml.DdeCreateStringHandle(idInst, items[i], 0)
} }
hConv = dde.DdeConnect(idInst, hszApp, hszTopic, nil) hConv = ddeml.DdeConnect(idInst, hszApp, hszTopic, nil)
dde.DdeFreeStringHandle(idInst, hszApp) ddeml.DdeFreeStringHandle(idInst, hszApp)
dde.DdeFreeStringHandle(idInst, hszTopic) ddeml.DdeFreeStringHandle(idInst, hszTopic)
if hConv == 0 { if hConv == 0 {
fmt.Printf("DDE Connection Failed.\n") fmt.Printf("DDE Connection Failed.\n")
time.Sleep(2e9) //2e9 相当于2秒 time.Sleep(2e9) //2e9 相当于2秒
dde.DdeUninitialize(idInst) ddeml.DdeUninitialize(idInst)
} }
for i := 0; i < len(items); i++ { for i := 0; i < len(items); i++ {
data := DDERequest(idInst, hConv, hszItem[i], "请求到服务端数据: ") data := dde.DDERequest(idInst, hConv, hszItem[i], "请求到服务端数据: ")
fmt.Printf("data: %v\n", data) fmt.Printf("data: %v\n", data)
DDEPoke(idInst, hConv, hszItem[i], data) dde.DDEPoke(idInst, hConv, hszItem[i], data)
time.Sleep(1e9) time.Sleep(1e9)
} }
fmt.Printf("客户端关闭") fmt.Printf("客户端关闭")
dde.DdeDisconnect(hConv) ddeml.DdeDisconnect(hConv)
dde.DdeUninitialize(idInst) ddeml.DdeUninitialize(idInst)
} }
func main() { func main() {

Loading…
Cancel
Save