初次提交
parent
82e76cff74
commit
e3258516ed
@ -0,0 +1,116 @@
|
||||
package ddeml
|
||||
|
||||
import (
|
||||
. "go-dde/types"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
DdeInitialize func(
|
||||
Inst *DWORD,
|
||||
Callback any,
|
||||
Cmd DWORD,
|
||||
Res DWORD) UINT
|
||||
|
||||
DdeUninitialize func(Inst DWORD) BOOL
|
||||
|
||||
DdeConnectList func(
|
||||
Inst DWORD,
|
||||
Service HSZ,
|
||||
Topic HSZ,
|
||||
ConvList HCONVLIST,
|
||||
CC *CONVCONTEXT) HCONVLIST
|
||||
|
||||
DdeQueryNextServer func(
|
||||
ConvList HCONVLIST, ConvPrev HCONV) HCONV
|
||||
|
||||
DdeDisconnectList func(ConvList HCONVLIST) BOOL
|
||||
|
||||
DdeConnect func(
|
||||
Inst DWORD,
|
||||
Service HSZ,
|
||||
Topic HSZ,
|
||||
CC *CONVCONTEXT) HCONV
|
||||
|
||||
DdeDisconnect func(Conv HCONV) BOOL
|
||||
|
||||
DdeReconnect func(Conv HCONV) HCONV
|
||||
|
||||
DdeQueryConvInfo func(
|
||||
Conv HCONV,
|
||||
Transaction DWORD,
|
||||
ConvInfo *CONVINFO) UINT
|
||||
|
||||
DdeSetUserHandle func(
|
||||
Conv HCONV, Id DWORD, User DWORD_PTR) BOOL
|
||||
|
||||
DdeAbandonTransaction func(
|
||||
Inst DWORD, Conv HCONV, Transaction DWORD) BOOL
|
||||
|
||||
DdePostAdvise func(
|
||||
Inst DWORD, Topic HSZ, Item HSZ) BOOL
|
||||
|
||||
DdeEnableCallback func(
|
||||
Inst DWORD, Conv HCONV, Cmd UINT) BOOL
|
||||
|
||||
DdeImpersonateClient func(Conv HCONV) BOOL
|
||||
|
||||
DdeNameService func(
|
||||
Inst DWORD, S1 HSZ, S2 HSZ, Cmd UINT) HDDEDATA
|
||||
|
||||
DdeClientTransaction func(
|
||||
Data unsafe.Pointer, //*BYTE
|
||||
cData DWORD,
|
||||
Conv HCONV,
|
||||
Item HSZ,
|
||||
Fmt UINT,
|
||||
Type UINT,
|
||||
Timeout DWORD,
|
||||
Result *DWORD) HDDEDATA
|
||||
|
||||
DdeCreateDataHandle func(
|
||||
Inst DWORD,
|
||||
Src *BYTE,
|
||||
C DWORD,
|
||||
Off DWORD,
|
||||
Item HSZ,
|
||||
Fmt UINT,
|
||||
Cmd UINT) HDDEDATA
|
||||
|
||||
DdeAddData func(
|
||||
Data HDDEDATA,
|
||||
Src *BYTE,
|
||||
C DWORD,
|
||||
Off DWORD) HDDEDATA
|
||||
|
||||
DdeGetData func(
|
||||
Data HDDEDATA,
|
||||
Dst *BYTE,
|
||||
Max DWORD,
|
||||
Off DWORD) DWORD
|
||||
|
||||
DdeAccessData func(
|
||||
Data HDDEDATA, DataSize *DWORD) *BYTE
|
||||
|
||||
DdeUnaccessData func(Data HDDEDATA) BOOL
|
||||
|
||||
DdeFreeDataHandle func(Data HDDEDATA) BOOL
|
||||
|
||||
DdeGetLastError func(Inst DWORD) UINT
|
||||
|
||||
DdeCreateStringHandle func(
|
||||
Inst DWORD, S VString, CodePage int) HSZ
|
||||
|
||||
DdeQueryString func(
|
||||
Inst DWORD,
|
||||
S HSZ,
|
||||
OS OVString,
|
||||
hMax DWORD,
|
||||
CodePage int) DWORD
|
||||
|
||||
DdeFreeStringHandle func(Inst DWORD, S HSZ) BOOL
|
||||
|
||||
DdeKeepStringHandle func(Inst DWORD, S HSZ) BOOL
|
||||
|
||||
DdeCmpStringHandles func(S1 HSZ, S2 HSZ) int
|
||||
)
|
@ -0,0 +1,279 @@
|
||||
package ddeml
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
. "go-dde/types"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func init() {
|
||||
user32 := syscall.MustLoadDLL("user32")
|
||||
DdeInitialize = func(
|
||||
Inst *DWORD,
|
||||
Callback any,
|
||||
Cmd DWORD,
|
||||
Res DWORD) UINT {
|
||||
proc := user32.MustFindProc("DdeInitializeW")
|
||||
res, _, err := proc.Call(
|
||||
uintptr(unsafe.Pointer(Inst)),
|
||||
syscall.NewCallback(Callback),
|
||||
uintptr(Cmd),
|
||||
0)
|
||||
if err != nil {
|
||||
fmt.Print(err.Error())
|
||||
}
|
||||
return UINT(res)
|
||||
}
|
||||
DdeUninitialize = func(Inst DWORD) BOOL {
|
||||
proc := user32.MustFindProc("DdeUninitialize")
|
||||
res, _, _ := proc.Call(uintptr(Inst))
|
||||
return BOOL(res)
|
||||
}
|
||||
DdeConnectList = func(
|
||||
Inst DWORD,
|
||||
Service HSZ,
|
||||
Topic HSZ,
|
||||
ConvList HCONVLIST,
|
||||
CC *CONVCONTEXT) HCONVLIST {
|
||||
proc := user32.MustFindProc("DdeConnectList")
|
||||
res, _, _ := proc.Call(
|
||||
uintptr(Inst),
|
||||
uintptr(Service),
|
||||
uintptr(Topic),
|
||||
uintptr(ConvList),
|
||||
uintptr(unsafe.Pointer(CC)))
|
||||
return HCONVLIST(res)
|
||||
}
|
||||
|
||||
DdeQueryNextServer = func(
|
||||
ConvList HCONVLIST, ConvPrev HCONV) HCONV {
|
||||
proc := user32.MustFindProc("DdeQueryNextServer")
|
||||
res, _, _ := proc.Call(uintptr(ConvList), uintptr(ConvPrev))
|
||||
return HCONV(res)
|
||||
}
|
||||
|
||||
DdeDisconnectList = func(ConvList HCONVLIST) BOOL {
|
||||
proc := user32.MustFindProc("DdeDisconnectList")
|
||||
res, _, _ := proc.Call(uintptr(ConvList))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeConnect = func(
|
||||
Inst DWORD,
|
||||
Service HSZ,
|
||||
Topic HSZ,
|
||||
CC *CONVCONTEXT) HCONV {
|
||||
proc := user32.MustFindProc("DdeConnect")
|
||||
res, _, _ := proc.Call(
|
||||
uintptr(Inst),
|
||||
uintptr(Service),
|
||||
uintptr(Topic),
|
||||
uintptr(unsafe.Pointer(CC)),
|
||||
)
|
||||
return HCONV(res)
|
||||
}
|
||||
|
||||
DdeDisconnect = func(Conv HCONV) BOOL {
|
||||
proc := user32.MustFindProc("DdeDisconnect")
|
||||
res, _, _ := proc.Call(uintptr(Conv))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeReconnect = func(Conv HCONV) HCONV {
|
||||
proc := user32.MustFindProc("DdeReconnect")
|
||||
res, _, _ := proc.Call(uintptr(Conv))
|
||||
return HCONV(res)
|
||||
}
|
||||
|
||||
DdeQueryConvInfo = func(
|
||||
Conv HCONV,
|
||||
Transaction DWORD,
|
||||
ConvInfo *CONVINFO) UINT {
|
||||
proc := user32.MustFindProc("DdeQueryConvInfo")
|
||||
res, _, _ := proc.Call(uintptr(Conv),
|
||||
uintptr(Transaction),
|
||||
uintptr(unsafe.Pointer(ConvInfo)))
|
||||
return UINT(res)
|
||||
}
|
||||
|
||||
DdeSetUserHandle = func(
|
||||
Conv HCONV, Id DWORD, User DWORD_PTR) BOOL {
|
||||
proc := user32.MustFindProc("DdeSetUserHandle")
|
||||
res, _, _ := proc.Call(uintptr(Conv), uintptr(Id), uintptr(User))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeAbandonTransaction = func(
|
||||
Inst DWORD, Conv HCONV, Transaction DWORD) BOOL {
|
||||
proc := user32.MustFindProc("DdeAbandonTransaction")
|
||||
res, _, _ := proc.Call(uintptr(Inst), uintptr(Conv), uintptr(Transaction))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdePostAdvise = func(
|
||||
Inst DWORD, Topic HSZ, Item HSZ) BOOL {
|
||||
proc := user32.MustFindProc("DdePostAdvise")
|
||||
res, _, _ := proc.Call(uintptr(Inst), uintptr(Topic), uintptr(Item))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeEnableCallback = func(
|
||||
Inst DWORD, Conv HCONV, Cmd UINT) BOOL {
|
||||
proc := user32.MustFindProc("DdeEnableCallback")
|
||||
res, _, _ := proc.Call(uintptr(Inst), uintptr(Conv), uintptr(Cmd))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeImpersonateClient = func(Conv HCONV) BOOL {
|
||||
proc := user32.MustFindProc("DdeImpersonateClient")
|
||||
res, _, _ := proc.Call(uintptr(Conv))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeNameService = func(
|
||||
Inst DWORD, S1 HSZ, S2 HSZ, Cmd UINT) HDDEDATA {
|
||||
proc := user32.MustFindProc("DdeNameService")
|
||||
res, _, _ := proc.Call(uintptr(Inst), uintptr(S1), uintptr(S2), uintptr(Cmd))
|
||||
return HDDEDATA(res)
|
||||
}
|
||||
|
||||
DdeClientTransaction = func(
|
||||
Data unsafe.Pointer, //*BYTE
|
||||
cData DWORD,
|
||||
Conv HCONV,
|
||||
Item HSZ,
|
||||
Fmt UINT,
|
||||
Type UINT,
|
||||
Timeout DWORD,
|
||||
Result *DWORD) HDDEDATA {
|
||||
proc := user32.MustFindProc("DdeClientTransaction")
|
||||
res, _, _ := proc.Call(
|
||||
uintptr(Data),
|
||||
uintptr(cData),
|
||||
uintptr(Conv),
|
||||
uintptr(Item),
|
||||
uintptr(Fmt),
|
||||
uintptr(Type),
|
||||
uintptr(Timeout),
|
||||
uintptr(unsafe.Pointer(Result)))
|
||||
return HDDEDATA(res)
|
||||
}
|
||||
|
||||
DdeCreateDataHandle = func(
|
||||
Inst DWORD,
|
||||
Src *BYTE,
|
||||
C DWORD,
|
||||
Off DWORD,
|
||||
Item HSZ,
|
||||
Fmt UINT,
|
||||
Cmd UINT) HDDEDATA {
|
||||
proc := user32.MustFindProc("DdeCreateDataHandle")
|
||||
res, _, _ := proc.Call(
|
||||
uintptr(Inst),
|
||||
uintptr(unsafe.Pointer(Src)),
|
||||
uintptr(C),
|
||||
uintptr(Off),
|
||||
uintptr(Item),
|
||||
uintptr(Fmt),
|
||||
uintptr(Cmd))
|
||||
return HDDEDATA(res)
|
||||
}
|
||||
|
||||
DdeAddData = func(
|
||||
Data HDDEDATA,
|
||||
Src *BYTE,
|
||||
C DWORD,
|
||||
Off DWORD) HDDEDATA {
|
||||
proc := user32.MustFindProc("DdeAddData")
|
||||
res, _, _ := proc.Call(uintptr(Data),
|
||||
uintptr(unsafe.Pointer(Src)),
|
||||
uintptr(C),
|
||||
uintptr(Off))
|
||||
return HDDEDATA(res)
|
||||
}
|
||||
|
||||
DdeGetData = func(
|
||||
Data HDDEDATA,
|
||||
Dst *BYTE,
|
||||
Max DWORD,
|
||||
Off DWORD) DWORD {
|
||||
proc := user32.MustFindProc("DdeGetData")
|
||||
res, _, _ := proc.Call(uintptr(Data),
|
||||
uintptr(unsafe.Pointer(Dst)),
|
||||
uintptr(Max),
|
||||
uintptr(Off))
|
||||
return DWORD(res)
|
||||
}
|
||||
|
||||
DdeAccessData = func(
|
||||
Data HDDEDATA, DataSize *DWORD) *BYTE {
|
||||
proc := user32.MustFindProc("DdeAccessData")
|
||||
res, _, _ := proc.Call(uintptr(Data),
|
||||
uintptr(unsafe.Pointer(DataSize)))
|
||||
return (*BYTE)(unsafe.Pointer(res))
|
||||
}
|
||||
|
||||
DdeUnaccessData = func(Data HDDEDATA) BOOL {
|
||||
proc := user32.MustFindProc("DdeUnaccessData")
|
||||
res, _, _ := proc.Call(uintptr(Data))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeFreeDataHandle = func(Data HDDEDATA) BOOL {
|
||||
proc := user32.MustFindProc("DdeFreeDataHandle")
|
||||
res, _, _ := proc.Call(uintptr(Data))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeGetLastError = func(Inst DWORD) UINT {
|
||||
proc := user32.MustFindProc("DdeGetLastError")
|
||||
res, _, _ := proc.Call(uintptr(Inst))
|
||||
return UINT(res)
|
||||
}
|
||||
|
||||
DdeCreateStringHandle = func(
|
||||
Inst DWORD, S VString, CodePage int) HSZ {
|
||||
u, _ := syscall.UTF16PtrFromString(string(S))
|
||||
proc := user32.MustFindProc("DdeCreateStringHandleW")
|
||||
res, _, _ := proc.Call(uintptr(Inst), uintptr(unsafe.Pointer(u)), uintptr(CodePage))
|
||||
return HSZ(res)
|
||||
}
|
||||
|
||||
DdeQueryString = func(
|
||||
Inst DWORD,
|
||||
S HSZ,
|
||||
OS OVString,
|
||||
hMax DWORD,
|
||||
CodePage int) DWORD {
|
||||
proc := user32.MustFindProc("DdeQueryStringW")
|
||||
res, _, _ := proc.Call(
|
||||
uintptr(Inst),
|
||||
uintptr(S),
|
||||
uintptr(unsafe.Pointer(&OS)),
|
||||
uintptr(hMax),
|
||||
uintptr(CodePage))
|
||||
return DWORD(res)
|
||||
}
|
||||
|
||||
DdeFreeStringHandle = func(Inst DWORD, S HSZ) BOOL {
|
||||
proc := user32.MustFindProc("DdeFreeStringHandle")
|
||||
res, _, _ := proc.Call(uintptr(Inst),
|
||||
uintptr(S))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeKeepStringHandle = func(Inst DWORD, S HSZ) BOOL {
|
||||
proc := user32.MustFindProc("DdeKeepStringHandle")
|
||||
res, _, _ := proc.Call(uintptr(Inst),
|
||||
uintptr(S))
|
||||
return BOOL(res)
|
||||
}
|
||||
|
||||
DdeCmpStringHandles = func(S1 HSZ, S2 HSZ) int {
|
||||
proc := user32.MustFindProc("DdeCmpStringHandles")
|
||||
res, _, _ := proc.Call(uintptr(S1),
|
||||
uintptr(S2))
|
||||
return int(res)
|
||||
}
|
||||
}
|
@ -0,0 +1,115 @@
|
||||
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()
|
||||
}
|
@ -0,0 +1,335 @@
|
||||
package types
|
||||
|
||||
var (
|
||||
DMLERR_NO_ERROR = 0x0000
|
||||
DMLERR_ADVACKTIMEOUT = 0x4000
|
||||
DMLERR_DATAACKTIMEOUT = 0x4002
|
||||
DMLERR_DLL_NOT_INITIALIZED = 0x4003
|
||||
DMLERR_EXECACKTIMEOUT = 0x4006
|
||||
DMLERR_NO_CONV_ESTABLISHED = 0x400A // (0x400A)
|
||||
DMLERR_POKEACKTIMEOUT = 0x400B
|
||||
DMLERR_POSTMSG_FAILED = 0x400C
|
||||
DMLERR_SERVER_DIED = 0x400E
|
||||
|
||||
CF_TEXT = 1
|
||||
CF_BITMAP = 2
|
||||
CF_METAFILEPICT = 3
|
||||
CF_SYLK = 4
|
||||
CF_DIF = 5
|
||||
CF_TIFF = 6
|
||||
CF_OEMTEXT = 7
|
||||
CF_DIB = 8
|
||||
CF_PALETTE = 9
|
||||
CF_PENDATA = 10
|
||||
CF_RIFF = 11
|
||||
CF_WAVE = 12
|
||||
CF_UNICODETEXT = 13
|
||||
CF_ENHMETAFILE = 14
|
||||
CF_HDROP = 15
|
||||
CF_LOCALE = 16
|
||||
CF_DIBV5 = 17
|
||||
CF_MAX = 18
|
||||
|
||||
DDE_FACK = 0x8000
|
||||
DDE_FBUSY = 0x4000
|
||||
DDE_FDEFERUPD = 0x4000
|
||||
DDE_FACKREQ = 0x8000
|
||||
DDE_FRELEASE = 0x2000
|
||||
DDE_FREQUESTED = 0x1000
|
||||
DDE_FAPPSTATUS = 0x00FF
|
||||
DDE_FNOTPROCESSED = 0x0000
|
||||
|
||||
//DDE_FACKRESERVED = ~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS)
|
||||
//DDE_FADVRESERVED = ~(DDE_FACKREQ | DDE_FDEFERUPD)
|
||||
//DDE_FDATRESERVED = ~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED)
|
||||
//DDE_FPOKRESERVED = ~(DDE_FRELEASE)
|
||||
|
||||
XTYPF_NOBLOCK = 0x0002
|
||||
XTYPF_NODATA = 0x0004
|
||||
XTYPF_ACKREQ = 0x0008
|
||||
|
||||
XCLASS_MASK = 0xFC00
|
||||
XCLASS_BOOL = 0x1000
|
||||
XCLASS_DATA = 0x2000
|
||||
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_MASK = 0x00F0
|
||||
XTYP_SHIFT = 4
|
||||
|
||||
TIMEOUT_ASYNC = 0xFFFFFFFF
|
||||
|
||||
APPCLASS_STANDARD = 0x00000000
|
||||
APPCMD_CLIENTONLY = 0x00000010
|
||||
|
||||
CP_WINANSI = 1004
|
||||
CP_WINUNICODE = 1200
|
||||
)
|
||||
|
||||
type (
|
||||
CString byte
|
||||
UString uint16
|
||||
OVString string
|
||||
VString string
|
||||
Fake_type_Fix_me uintptr
|
||||
enum int
|
||||
ACCESS_MASK DWORD
|
||||
AChar Char
|
||||
ALG_ID Unsigned_int
|
||||
AString *string
|
||||
ATOM WORD
|
||||
BOOL int
|
||||
BOOLEAN byte
|
||||
BSTR *OLECHAR
|
||||
BYTE byte
|
||||
CALID DWORD
|
||||
CALTYPE DWORD
|
||||
CH AChar
|
||||
CLIPFORMAT WORD
|
||||
COLOR16 USHORT
|
||||
COLORREF DWORD
|
||||
Char uint8
|
||||
DATE DOUBLE
|
||||
DISPID int32
|
||||
DOUBLE float64
|
||||
DWORD uint32 //TODO(t):True w32/w64?
|
||||
DWORDLONG uint64 //TODO(t):True w32/w64?
|
||||
DWORD_PTR ULONG_PTR
|
||||
EXECUTION_STATE DWORD
|
||||
FARPROC uintptr //TODO(t):unsafe.Pointer?
|
||||
FLOAT float32
|
||||
FOURCC DWORD
|
||||
FXPT2DOT30 LONG
|
||||
GEOCLASS DWORD
|
||||
GEOID LONG
|
||||
GEOTYPE DWORD
|
||||
GROUP uint
|
||||
HACCEL HANDLE
|
||||
HANDLE DWORD //TODO(t):Actually strict -> struct but go does not do coercion
|
||||
HBITMAP int //TODO(t):HANDLE but go does not do coercion
|
||||
HBRUSH HANDLE
|
||||
HCOLORSPACE HANDLE
|
||||
HCONV HANDLE
|
||||
HCONVLIST HANDLE
|
||||
HCRYPTHASH ULONG_PTR
|
||||
HCRYPTKEY ULONG_PTR
|
||||
HCRYPTPROV ULONG_PTR
|
||||
HCURSOR HANDLE
|
||||
HDC HANDLE
|
||||
HDDEDATA HANDLE
|
||||
HDESK HANDLE
|
||||
HDEVNOTIFY HANDLE
|
||||
HDPA HANDLE
|
||||
HDROP HANDLE
|
||||
HDRVR HANDLE
|
||||
HDSA HANDLE
|
||||
HDWP HANDLE
|
||||
HENHMETAFILE HANDLE
|
||||
HFILE HANDLE
|
||||
HFONT HANDLE
|
||||
HGDIOBJ HANDLE
|
||||
HGLOBAL HANDLE
|
||||
HGLRC HANDLE
|
||||
HHOOK HANDLE
|
||||
HICON HANDLE
|
||||
HIMAGELIST HANDLE
|
||||
HINSTANCE HANDLE
|
||||
HKEY HANDLE
|
||||
HKL HANDLE
|
||||
HLOCAL HANDLE
|
||||
HMENU HANDLE
|
||||
HMETAFILE HANDLE
|
||||
HMIDI HANDLE
|
||||
HMIDIIN HANDLE
|
||||
HMIDIOUT HANDLE
|
||||
HMIDISTRM HANDLE
|
||||
HMIXER HANDLE
|
||||
HMIXEROBJ HANDLE
|
||||
HMMIO HANDLE
|
||||
HMODULE HINSTANCE
|
||||
HMONITOR HANDLE
|
||||
HOLEMENU HANDLE
|
||||
HPALETTE HANDLE
|
||||
HPEN HANDLE
|
||||
HRAWINPUT HANDLE
|
||||
HRESULT HANDLE
|
||||
HRGN HANDLE
|
||||
HRSRC HANDLE
|
||||
HSZ HANDLE
|
||||
HTASK HANDLE
|
||||
HWAVEIN HANDLE
|
||||
HWAVEOUT HANDLE
|
||||
HWINEVENTHOOK HANDLE
|
||||
HWINSTA HANDLE
|
||||
HWND HANDLE
|
||||
IAdviseSink struct{}
|
||||
IBindCtx struct{}
|
||||
IBindStatusCallback struct{}
|
||||
IChannelHook struct{}
|
||||
IClassFactory struct{}
|
||||
ICreateErrorInfo struct{}
|
||||
ICreateTypeLib struct{}
|
||||
ICreateTypeLib2 struct{}
|
||||
IDataAdviseHolder struct{}
|
||||
IDataObject struct{}
|
||||
IDispatch struct{}
|
||||
IDropSource struct{}
|
||||
IDropTarget struct{}
|
||||
IEnumFORMATETC struct{}
|
||||
IEnumOLEVERB struct{}
|
||||
IErrorInfo struct{}
|
||||
IFillLockBytes struct{}
|
||||
IInitializeSpy struct{}
|
||||
ILockBytes struct{}
|
||||
IMalloc struct{}
|
||||
IMallocSpy struct{}
|
||||
IMarshal struct{}
|
||||
IMessageFilter struct{}
|
||||
IMoniker struct{}
|
||||
INT int
|
||||
INT_PTR INT
|
||||
IOAString *string
|
||||
IOleAdviseHolder struct{}
|
||||
IOleClientSite struct{}
|
||||
IOleInPlaceActiveObject struct{}
|
||||
IOleInPlaceFrame struct{}
|
||||
IOleObject struct{}
|
||||
IPersistStorage struct{}
|
||||
IPersistStream struct{}
|
||||
IRecordInfo struct{}
|
||||
IRunningObjectTable struct{}
|
||||
IStorage struct{}
|
||||
IStream struct{}
|
||||
ISurrogate struct{}
|
||||
ITypeInfo struct{}
|
||||
ITypeLib struct{}
|
||||
IUnknown struct{}
|
||||
LANGID USHORT
|
||||
LCID DWORD
|
||||
LCSCSTYPE LONG
|
||||
LCSGAMUTMATCH LONG
|
||||
LCTYPE DWORD
|
||||
LGRPID DWORD
|
||||
LONG int32 //TODO(t):?SIZE __3264
|
||||
LONG64 int64
|
||||
LONGLONG int64 //TODO(t):Win64=128
|
||||
LONG_PTR LONG
|
||||
LPARAM LONG_PTR
|
||||
LRESULT LONG_PTR
|
||||
MCIDEVICEID UINT
|
||||
MCIERROR DWORD
|
||||
MENUTEMPLATE *VOID
|
||||
MMRESULT UINT
|
||||
MMVERSION UINT
|
||||
MVString *string //TODO(t):*[]string?
|
||||
NLS_FUNCTION DWORD
|
||||
OAString *string
|
||||
OLECHAR WChar
|
||||
OLESTR WString
|
||||
OLESTREAM struct{}
|
||||
OMVString *string //TODO(t):*[]string ?
|
||||
OWString *string
|
||||
REGSAM ACCESS_MASK
|
||||
RPC_AUTHZ_HANDLE *VOID
|
||||
RPC_AUTH_IDENTITY_HANDLE *VOID
|
||||
SCODE int32
|
||||
SC_HANDLE HANDLE
|
||||
SC_LOCK *VOID
|
||||
SECURITY_CONTEXT_TRACKING_MODE BOOLEAN
|
||||
SECURITY_DESCRIPTOR_CONTROL USHORT
|
||||
SECURITY_INFORMATION DWORD
|
||||
SERVICETYPE ULONG
|
||||
SERVICE_STATUS_HANDLE HANDLE
|
||||
SHORT int16
|
||||
SIZE_T ULONG_PTR
|
||||
SNB **OLECHAR
|
||||
SOCKET UINT_PTR
|
||||
STREAM IStream
|
||||
UCHAR byte
|
||||
UINT uint
|
||||
UINT_PTR UINT
|
||||
ULONG DWORD //TODO(t):size
|
||||
ULONG64 uint64
|
||||
ULONGLONG uint64 //TODO(t):Win64=128?
|
||||
ULONG_PTR uintptr //TODO(t):true def
|
||||
USHORT uint16 //TODO(t):size
|
||||
U_int uint
|
||||
U_long uint32
|
||||
U_short uint16
|
||||
Unsigned_int uint
|
||||
Unsigned_long uint32
|
||||
Unsigned_short uint16
|
||||
VARIANT_BOOL int16
|
||||
VARTYPE uint16
|
||||
VChar *uint16 //TODO(t): uint8/uint16
|
||||
VOID struct{} // //TODO(t):Go does not do coercion; Any side-effects?
|
||||
VOID64 struct{} //TODO(t):__ptr64 //TODO(t):Go does not do coercion; Any side-effects?
|
||||
WChar uint16
|
||||
WORD uint16 //TODO(t):True 32/64? signed?
|
||||
WPARAM LONG_PTR
|
||||
WSAEVENT HANDLE
|
||||
WString *string
|
||||
)
|
||||
|
||||
type FNCALLBACK func(
|
||||
Type UINT,
|
||||
Fmt UINT,
|
||||
Conv HCONV,
|
||||
Sz1 HSZ,
|
||||
Sz2 HSZ,
|
||||
Data HDDEDATA,
|
||||
Data1 ULONG_PTR,
|
||||
Data2 ULONG_PTR) HDDEDATA
|
||||
|
||||
type SECURITY_IMPERSONATION_LEVEL enum
|
||||
|
||||
type SECURITY_QUALITY_OF_SERVICE struct {
|
||||
Length DWORD
|
||||
ImpersonationLevel SECURITY_IMPERSONATION_LEVEL
|
||||
ContextTrackingMode SECURITY_CONTEXT_TRACKING_MODE
|
||||
EffectiveOnly BOOLEAN
|
||||
}
|
||||
type CONVCONTEXT struct {
|
||||
Size UINT
|
||||
Flags UINT
|
||||
CountryID UINT
|
||||
CodePage int
|
||||
LangID DWORD
|
||||
Security DWORD
|
||||
QoS SECURITY_QUALITY_OF_SERVICE
|
||||
}
|
||||
type CONVINFO struct {
|
||||
Size DWORD
|
||||
User DWORD_PTR
|
||||
ConvPartner HCONV
|
||||
SvcPartner HSZ
|
||||
ServiceReq HSZ
|
||||
Topic HSZ
|
||||
Item HSZ
|
||||
Fmt UINT
|
||||
Type UINT
|
||||
Status UINT
|
||||
Convst UINT
|
||||
LastError UINT
|
||||
ConvList HCONVLIST
|
||||
ConvCtxt CONVCONTEXT
|
||||
Wnd HWND
|
||||
WndPartner HWND
|
||||
}
|
@ -0,0 +1,84 @@
|
||||
package util
|
||||
|
||||
var (
|
||||
DMLERR_NO_ERROR = 0x0000
|
||||
DMLERR_ADVACKTIMEOUT = 0x4000
|
||||
DMLERR_DATAACKTIMEOUT = 0x4002
|
||||
DMLERR_DLL_NOT_INITIALIZED = 0x4003
|
||||
DMLERR_EXECACKTIMEOUT = 0x4006
|
||||
DMLERR_NO_CONV_ESTABLISHED = 0x400A // (0x400A)
|
||||
DMLERR_POKEACKTIMEOUT = 0x400B
|
||||
DMLERR_POSTMSG_FAILED = 0x400C
|
||||
DMLERR_SERVER_DIED = 0x400E
|
||||
|
||||
CF_TEXT = 1
|
||||
CF_BITMAP = 2
|
||||
CF_METAFILEPICT = 3
|
||||
CF_SYLK = 4
|
||||
CF_DIF = 5
|
||||
CF_TIFF = 6
|
||||
CF_OEMTEXT = 7
|
||||
CF_DIB = 8
|
||||
CF_PALETTE = 9
|
||||
CF_PENDATA = 10
|
||||
CF_RIFF = 11
|
||||
CF_WAVE = 12
|
||||
CF_UNICODETEXT = 13
|
||||
CF_ENHMETAFILE = 14
|
||||
CF_HDROP = 15
|
||||
CF_LOCALE = 16
|
||||
CF_DIBV5 = 17
|
||||
CF_MAX = 18
|
||||
|
||||
DDE_FACK = 0x8000
|
||||
DDE_FBUSY = 0x4000
|
||||
DDE_FDEFERUPD = 0x4000
|
||||
DDE_FACKREQ = 0x8000
|
||||
DDE_FRELEASE = 0x2000
|
||||
DDE_FREQUESTED = 0x1000
|
||||
DDE_FAPPSTATUS = 0x00FF
|
||||
DDE_FNOTPROCESSED = 0x0000
|
||||
|
||||
//DDE_FACKRESERVED = ~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS)
|
||||
//DDE_FADVRESERVED = ~(DDE_FACKREQ | DDE_FDEFERUPD)
|
||||
//DDE_FDATRESERVED = ~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED)
|
||||
//DDE_FPOKRESERVED = ~(DDE_FRELEASE)
|
||||
|
||||
XTYPF_NOBLOCK = 0x0002
|
||||
XTYPF_NODATA = 0x0004
|
||||
XTYPF_ACKREQ = 0x0008
|
||||
|
||||
XCLASS_MASK = 0xFC00
|
||||
XCLASS_BOOL = 0x1000
|
||||
XCLASS_DATA = 0x2000
|
||||
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_MASK = 0x00F0
|
||||
XTYP_SHIFT = 4
|
||||
|
||||
TIMEOUT_ASYNC = 0xFFFFFFFF
|
||||
|
||||
APPCLASS_STANDARD = 0x00000000
|
||||
APPCMD_CLIENTONLY = 0x00000010
|
||||
|
||||
CP_WINANSI = 1004
|
||||
CP_WINUNICODE = 1200
|
||||
)
|
Loading…
Reference in New Issue