修改客户端实现完成
This commit is contained in:
parent
e3258516ed
commit
d6deeebed3
39
dde/dde.go
Normal file
39
dde/dde.go
Normal file
@ -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 (
|
||||
. "go-dde/types"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -59,7 +58,7 @@ var (
|
||||
Inst DWORD, S1 HSZ, S2 HSZ, Cmd UINT) HDDEDATA
|
||||
|
||||
DdeClientTransaction func(
|
||||
Data unsafe.Pointer, //*BYTE
|
||||
Data *BYTE, //*BYTE
|
||||
cData DWORD,
|
||||
Conv HCONV,
|
||||
Item HSZ,
|
||||
|
@ -139,7 +139,7 @@ func init() {
|
||||
}
|
||||
|
||||
DdeClientTransaction = func(
|
||||
Data unsafe.Pointer, //*BYTE
|
||||
Data *BYTE, //*BYTE
|
||||
cData DWORD,
|
||||
Conv HCONV,
|
||||
Item HSZ,
|
||||
@ -149,7 +149,7 @@ func init() {
|
||||
Result *DWORD) HDDEDATA {
|
||||
proc := user32.MustFindProc("DdeClientTransaction")
|
||||
res, _, _ := proc.Call(
|
||||
uintptr(Data),
|
||||
uintptr(unsafe.Pointer(Data)),
|
||||
uintptr(cData),
|
||||
uintptr(Conv),
|
||||
uintptr(Item),
|
||||
|
57
main.go
57
main.go
@ -2,14 +2,10 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
dde "go-dde/ddeml"
|
||||
"go-dde/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 {
|
||||
@ -44,28 +40,6 @@ var callbacks FNCALLBACK = func(
|
||||
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"
|
||||
@ -73,12 +47,9 @@ var items []VString = []VString{"MyItem0", "MyItem1", "MyItem2", "MyItem3", "MyI
|
||||
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)
|
||||
iReturn := ddeml.DdeInitialize(&idInst, DdeCallback, cmd, res)
|
||||
if iReturn != UINT(DMLERR_NO_ERROR) {
|
||||
|
||||
}
|
||||
@ -86,28 +57,28 @@ func runClient() {
|
||||
fmt.Printf("DDE Initialization Failed")
|
||||
}
|
||||
var hConv HCONV // 会话句柄
|
||||
hszApp := dde.DdeCreateStringHandle(idInst, szApp, 0)
|
||||
hszTopic := dde.DdeCreateStringHandle(idInst, szTopic, 0)
|
||||
hszApp := ddeml.DdeCreateStringHandle(idInst, szApp, 0)
|
||||
hszTopic := ddeml.DdeCreateStringHandle(idInst, szTopic, 0)
|
||||
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)
|
||||
dde.DdeFreeStringHandle(idInst, hszApp)
|
||||
dde.DdeFreeStringHandle(idInst, hszTopic)
|
||||
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秒
|
||||
dde.DdeUninitialize(idInst)
|
||||
ddeml.DdeUninitialize(idInst)
|
||||
}
|
||||
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)
|
||||
DDEPoke(idInst, hConv, hszItem[i], data)
|
||||
dde.DDEPoke(idInst, hConv, hszItem[i], data)
|
||||
time.Sleep(1e9)
|
||||
}
|
||||
fmt.Printf("客户端关闭")
|
||||
dde.DdeDisconnect(hConv)
|
||||
dde.DdeUninitialize(idInst)
|
||||
ddeml.DdeDisconnect(hConv)
|
||||
ddeml.DdeUninitialize(idInst)
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user