From 07d39981113d5c4068c157de43fc9ea967b8addd Mon Sep 17 00:00:00 2001 From: 15128022404 <1421485150@qq.com> Date: Tue, 18 Oct 2022 16:39:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96dde,=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=93=E5=AF=B9=E8=B1=A1=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dde/dde.go | 201 +++++++++++++++++++++++++++++++++++++++++++- ddeml/ddeml.go | 2 +- ddeml/ddeml_impl.go | 2 +- demo/demo.go | 145 ++++++++++++++++++++++++++++++++ main.go | 154 ++++----------------------------- types/types.go | 38 ++++----- 6 files changed, 380 insertions(+), 162 deletions(-) create mode 100644 demo/demo.go diff --git a/dde/dde.go b/dde/dde.go index 8049f26..f66b488 100644 --- a/dde/dde.go +++ b/dde/dde.go @@ -7,16 +7,213 @@ package dde import "C" import ( + "fmt" ddeml "go-dde/ddeml" . "go-dde/types" + "time" "unsafe" ) const ( - MAX_BUFFER_SIZE = 16 + MAX_BUFFER_SIZE = 2147483647 ) -func DDERequest(idInst DWORD, hConv HCONV, hszItem HSZ, sDesc string) string { +type DdeMeta struct { + IdInst DWORD //全局句柄 + HConv HCONV //会话句柄 + Callback FNCALLBACK //回调函数 + AppName VString //服务名称 + TopicName VString //主题名称 + Items []VString //单元项目字符串数组 + HszApp HSZ //服务字符串句柄 + HszTopic HSZ //主题字符串句柄 + HszItem []HSZ //单元项目字符串句柄数组 +} +type DdeClient struct { + DdeMeta +} + +func (c *DdeClient) Run() bool { + var cmd DWORD = DWORD(APPCLASS_STANDARD | APPCMD_CLIENTONLY) + var res DWORD = 0 + if c.Callback == nil { + c.Callback = c.MetaCallBackfunc + } + iReturn := ddeml.DdeInitialize(&c.IdInst, c.Callback, cmd, res) + if int(iReturn) != DMLERR_NO_ERROR { + fmt.Printf("DDE Initialization Failed") + } + c.HszApp = ddeml.DdeCreateStringHandle(c.IdInst, c.AppName, 0) + c.HszTopic = ddeml.DdeCreateStringHandle(c.IdInst, c.TopicName, 0) + c.HszItem = make([]HSZ, len(c.Items)) + for i := 0; i < len(c.Items); i++ { + c.HszItem[i] = ddeml.DdeCreateStringHandle(c.IdInst, c.Items[i], 0) + } + c.HConv = ddeml.DdeConnect(c.IdInst, c.HszApp, c.HszTopic, nil) + if c.HConv == HCONV(NULL) { + fmt.Printf("DDE Connection Failed.\n") + time.Sleep(2e9) //2e9 相当于2秒 + c.DestoryClient() + return false + } + return true +} + +func (c *DdeClient) DestoryClient() { + ddeml.DdeFreeStringHandle(c.IdInst, c.HszApp) + ddeml.DdeFreeStringHandle(c.IdInst, c.HszTopic) + for i := 0; i < len(c.Items); i++ { + ddeml.DdeFreeStringHandle(c.IdInst, c.HszItem[i]) + } + fmt.Printf("客户端关闭") + ddeml.DdeDisconnect(c.HConv) + ddeml.DdeUninitialize(c.IdInst) +} + +type DdeServer struct { + DdeMeta + close bool //服务状态 +} + +func (c *DdeServer) RunServer() bool { + if c.Callback == nil { + c.Callback = c.MetaCallBackfunc + } + iReturn := ddeml.DdeInitialize(&c.IdInst, c.Callback, DWORD(APPCLASS_STANDARD), 0) + if int(iReturn) != DMLERR_NO_ERROR { + fmt.Printf("DDE Initialization Failed") + } + c.HszApp = ddeml.DdeCreateStringHandle(c.IdInst, c.AppName, 0) + c.HszTopic = ddeml.DdeCreateStringHandle(c.IdInst, c.TopicName, 0) + c.HszItem = make([]HSZ, len(c.Items)) + for i := 0; i < len(c.Items); i++ { + c.HszItem[i] = ddeml.DdeCreateStringHandle(c.IdInst, c.Items[i], 0) + } + sever := ddeml.DdeNameService(c.IdInst, c.HszApp, 0, UINT(DNS_REGISTER)) + defer c.DestoryServer() + if int(sever) != TRUE { + fmt.Printf("DdeNameService() failed!") + return false + } + c.close = false + fmt.Printf("服务端开启") + for { + //do something + var msg TagMSG + if int(ddeml.GetMessage(&msg, 0, 0, 0)) <= 0 { + if c.close { + break + } + } + ddeml.TranslateMessage(&msg) + ddeml.DispatchMessage(&msg) + } + return true +} + +func (c *DdeServer) DestoryServer() { + c.close = true + ddeml.DdeFreeStringHandle(c.IdInst, c.HszApp) + ddeml.DdeFreeStringHandle(c.IdInst, c.HszTopic) + for i := 0; i < len(c.Items); i++ { + ddeml.DdeFreeStringHandle(c.IdInst, c.HszItem[i]) + } + fmt.Printf("服务端关闭") + ddeml.DdeNameService(c.IdInst, c.HszApp, 0, UINT(DNS_UNREGISTER)) + ddeml.DdeUninitialize(c.IdInst) +} + +func (c *DdeServer) IsHSZItem(hsz2 HSZ) HSZ { + for i := 0; i < len(c.Items); i++ { + if ddeml.DdeCmpStringHandles(HSZ(hsz2), c.HszItem[i]) <= 0 { + return c.HszItem[i] + } + } + return 0 +} + +func (c *DdeMeta) MetaCallBackfunc(wType UINT, wFmt UINT, hConv HCONV, hsz1 HSZ, hsz2 HSZ, hData HDDEDATA, dwData1 ULONG_PTR, dwData2 ULONG_PTR) HDDEDATA { + return 0 +} +func (c *DdeServer) MetaCallBackfunc(wType UINT, wFmt UINT, hConv HCONV, hsz1 HSZ, hsz2 HSZ, hData HDDEDATA, dwData1 ULONG_PTR, dwData2 ULONG_PTR) HDDEDATA { + selectItem := c.IsHSZItem(hsz2) + var res HDDEDATA + switch wType { + case XTYP_CONNECT: + //接受客户端链接; + if ddeml.DdeCmpStringHandles(HSZ(hsz1), c.HszTopic) <= 0 && + ddeml.DdeCmpStringHandles(HSZ(hsz2), c.HszApp) <= 0 { + res = HDDEDATA(TRUE) + } else { + res = HDDEDATA(FALSE) //接受客户端链接 + } + case XTYP_ADVSTART: + //客户端启动咨询循环。 + if ddeml.DdeCmpStringHandles(HSZ(hsz1), c.HszTopic) <= 0 && + ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 { + res = HDDEDATA(TRUE) + } else { + res = HDDEDATA(FALSE) //接受客户端链接 + } + case XTYP_ADVREQ: + if ddeml.DdeCmpStringHandles(HSZ(hsz1), c.HszTopic) <= 0 && + ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 { + res = c.SendMessage("XTYP_ADVREQ", selectItem, UINT(wFmt)) + } + //广播数据; + case XTYP_REQUEST: + if ddeml.DdeCmpStringHandles(HSZ(hsz1), c.HszTopic) <= 0 && + ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 { + res = c.SendMessage("XTYP_REQUEST哈哈", selectItem, UINT(wFmt)) + } + //数据请求; + case XTYP_POKE: + if ddeml.DdeCmpStringHandles(HSZ(hsz1), c.HszTopic) <= 0 && + ddeml.DdeCmpStringHandles(HSZ(hsz2), selectItem) <= 0 { + message := c.GetMessage(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 +} +func (c *DdeMeta) Request(hszItem HSZ) string { + hData := ddeml.DdeClientTransaction(nil, 0, c.HConv, hszItem, UINT(CF_TEXT), + UINT(XTYP_REQUEST), 5000, nil) + if hData == 0 { + return "Request failed" + } else { + return DDEGetMessage(hData) + } +} +func (c *DdeMeta) Poke(hszItem HSZ, szData string) { + cs := C.CString(szData) + ddeml.DdeClientTransaction((*BYTE)(unsafe.Pointer(cs)), + DWORD(len(szData)+1), + c.HConv, hszItem, UINT(CF_TEXT), + UINT(XTYP_POKE), 3000, nil) + C.free(unsafe.Pointer(cs)) +} +func (c *DdeMeta) SendMessage(Src string, Item HSZ, Fmt UINT) HDDEDATA { + cs := C.CString(Src) + hdata := ddeml.DdeCreateDataHandle(c.IdInst, (*BYTE)(unsafe.Pointer(cs)), DWORD(len(Src)+1), 0, Item, Fmt, 0) + C.free(unsafe.Pointer(cs)) + return hdata +} +func (c *DdeMeta) GetMessage(hData HDDEDATA) string { + 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 DDERequest(idInst DWORD, hConv HCONV, hszItem HSZ) string { hData := ddeml.DdeClientTransaction(nil, 0, hConv, hszItem, UINT(CF_TEXT), UINT(XTYP_REQUEST), 5000, nil) if hData == 0 { diff --git a/ddeml/ddeml.go b/ddeml/ddeml.go index a818542..3e77ba1 100644 --- a/ddeml/ddeml.go +++ b/ddeml/ddeml.go @@ -7,7 +7,7 @@ import ( var ( DdeInitialize func( Inst *DWORD, - Callback any, + Callback FNCALLBACK, //any Cmd DWORD, Res DWORD) UINT diff --git a/ddeml/ddeml_impl.go b/ddeml/ddeml_impl.go index bd98a5b..ec73f16 100644 --- a/ddeml/ddeml_impl.go +++ b/ddeml/ddeml_impl.go @@ -10,7 +10,7 @@ func init() { user32 := syscall.MustLoadDLL("user32") DdeInitialize = func( Inst *DWORD, - Callback any, + Callback FNCALLBACK, //any Cmd DWORD, Res DWORD) UINT { proc := user32.MustFindProc("DdeInitializeW") diff --git a/demo/demo.go b/demo/demo.go new file mode 100644 index 0000000..c05aa21 --- /dev/null +++ b/demo/demo.go @@ -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) + } +} diff --git a/main.go b/main.go index 4874cc1..5c53b5f 100644 --- a/main.go +++ b/main.go @@ -3,158 +3,34 @@ package main import ( "fmt" "go-dde/dde" - "go-dde/ddeml" . "go-dde/types" "time" ) -func isHSZItem(hsz2 uintptr) HSZ { - for i := 0; i < len(items); i++ { - if ddeml.DdeCmpStringHandles(HSZ(hsz2), hszItem[i]) <= 0 { - return hszItem[i] - } - } - return 0 -} - -func DdeCallback(wType int, wFmt int, hConv uintptr, hsz1 uintptr, hsz2 uintptr, hData HDDEDATA, dwData1 int64, dwData2 int64) int { - 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 int(res) -} - -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 -} - -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], "请求到服务端数据: ") + ddecli := dde.DdeClient{} + ddecli.AppName = "Server" + ddecli.TopicName = "MyTopic" + ddecli.Items = []VString{"MyItem0", "MyItem1", "MyItem2", "MyItem3", "MyItem4", "MyItem5", "MyItem6"} + ddecli.Run() + for i := 0; i < len(ddecli.Items); i++ { + data := ddecli.Request(ddecli.HszItem[i]) fmt.Printf("data: %v\n", data) - dde.DDEPoke(idInst, hConv, hszItem[i], data) + ddecli.Poke(ddecli.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) - } - + ddeser := dde.DdeServer{} + ddeser.AppName = "Server" + ddeser.TopicName = "MyTopic" + ddeser.Items = []VString{"MyItem0", "MyItem1", "MyItem2", "MyItem3", "MyItem4", "MyItem5", "MyItem6"} + defer ddeser.DestoryServer() + ddeser.RunServer() } func main() { //runClient() runServer() + } diff --git a/types/types.go b/types/types.go index 89892b2..727afb0 100644 --- a/types/types.go +++ b/types/types.go @@ -54,25 +54,25 @@ var ( XCLASS_FLAGS = 0x4000 XCLASS_NOTIFICATION = 0x8000 - XTYP_ERROR = 0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK - XTYP_ADVDATA = 0x0010 | XCLASS_FLAGS - XTYP_ADVREQ = 0x0020 | XCLASS_DATA | XTYPF_NOBLOCK - XTYP_ADVSTART = 0x0030 | XCLASS_BOOL - XTYP_ADVSTOP = 0x0040 | XCLASS_NOTIFICATION - XTYP_EXECUTE = 0x0050 | XCLASS_FLAGS - XTYP_CONNECT = 0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK - XTYP_CONNECT_CONFIRM = 0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK - XTYP_XACT_COMPLETE = 0x0080 | XCLASS_NOTIFICATION - XTYP_POKE = 0x0090 | XCLASS_FLAGS - XTYP_REGISTER = 0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK - XTYP_REQUEST = 0x00B0 | XCLASS_DATA - XTYP_DISCONNECT = 0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK - XTYP_UNREGISTER = 0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK - XTYP_WILDCONNECT = 0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK - XTYP_MONITOR = 0x00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK + XTYP_ERROR = UINT(0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK) + XTYP_ADVDATA = UINT(0x0010 | XCLASS_FLAGS) + XTYP_ADVREQ = UINT(0x0020 | XCLASS_DATA | XTYPF_NOBLOCK) + XTYP_ADVSTART = UINT(0x0030 | XCLASS_BOOL) + XTYP_ADVSTOP = UINT(0x0040 | XCLASS_NOTIFICATION) + XTYP_EXECUTE = UINT(0x0050 | XCLASS_FLAGS) + XTYP_CONNECT = UINT(0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK) + XTYP_CONNECT_CONFIRM = UINT(0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK) + XTYP_XACT_COMPLETE = UINT(0x0080 | XCLASS_NOTIFICATION) + XTYP_POKE = UINT(0x0090 | XCLASS_FLAGS) + XTYP_REGISTER = UINT(0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK) + XTYP_REQUEST = UINT(0x00B0 | XCLASS_DATA) + XTYP_DISCONNECT = UINT(0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK) + XTYP_UNREGISTER = UINT(0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK) + XTYP_WILDCONNECT = UINT(0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK) + XTYP_MONITOR = UINT(0x00F0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK) - XTYP_MASK = 0x00F0 - XTYP_SHIFT = 4 + XTYP_MASK = UINT(0x00F0) + XTYP_SHIFT = UINT(4) TIMEOUT_ASYNC = 0xFFFFFFFF @@ -141,7 +141,7 @@ type ( HCRYPTPROV ULONG_PTR HCURSOR HANDLE HDC HANDLE - HDDEDATA HANDLE + HDDEDATA int HDESK HANDLE HDEVNOTIFY HANDLE HDPA HANDLE