Scripts/DDEClientClass

From J Wiki
Jump to: navigation, search

Download this script: File:Dmdde.ijs

NB. DDE Client interface class
NB.
NB. Use Windows API DDEML for DDE Client access
NB.
NB.   r=. ddereq__ob data
NB.   r=. ddeex__ob  data
NB.	
NB. ddereq returns the text returned by the successful DDE call.
NB. ddeex returns the return code from the ddeex call.
NB.
NB.   ddecleanup__ob''
NB.
NB. terminates and cleans up any DDE resources.
NB.
NB. Example:
NB.
NB. test=: 3 : 0
NB. dd=.conew 'dmdde'
NB. 'iexplore' create__dd 'WWW_OpenURL'
NB. ddeex__dd '"http://www.jsoftware.com"'
NB. destroy__dd ''
NB. )

require 'dll convert winapi strings'

coclass'dmdde'

DdeInitialize=: 2&{.@:('user32 DdeInitializeA i *i i i i'&cd)
DdeCreateStringHandle=: 0&{@:('user32 DdeCreateStringHandleA i i *c i'&cd)
DdeFreeStringHandle=: ('user32 DdeFreeStringHandle i i i'&cd)
DdeQueryString=: ('user32 DdeQueryStringA i i i *c i i'&cd)
DdeKeepStringHandle=: ('user32 DdeKeepStringHandle i i i'&cd)
DdeConnect=: 0&{@:('user32 DdeConnect i i i i i'&cd)
DdeDisconnect=: ('user32 DdeDisconnect i i'&cd)
DdeGetLastError=: 0&{@:('user32 DdeGetLastError i i'&cd)
DdeUninitialize=: ('user32 DdeUninitialize i i'&cd)
DdeClientTransaction=: 0&{@:('user32 DdeClientTransaction i i i i i i i i *i'&cd)
DdeClientTransactiona=: 0&{@:('user32 DdeClientTransaction i *c i i i i i i *i'&cd)
DdeAccessData=: ('user32 DdeAccessData i i *i'&cd)
DdeUnaccessData=: ('user32 DdeUnaccessData i i'&cd)

CP_WINANSI=:1004    NB. /* default codepage for windows & old DDE convs. */
XCLASS_DATA=: (dfh'2000')
XCLASS_FLAGS=: (dfh'4000')
XTYP_REQUEST=: ((dfh'00B0')+XCLASS_DATA)
XTYP_EXECUTE=: ((dfh'0050')+XCLASS_FLAGS)
CF_TEXT=: 1
DMLERR_NO_ERROR=: 0
TIMEOUT_ASYNC=: _1

DDECB=: cdcb 8 NB. address of C routine with 8 integer arguments

DDEINST_dmdde_=:0

NB. =========================================================
NB.*ddesetup v setup dde
NB. form: ddesetup ''
NB. returns handle
ddesetup=: 3 : 0
'r inst'=.DdeInitialize (,0);DDECB;0;0
if. r~:DMLERR_NO_ERROR do. throw. r end.
DDEINST_dmdde_=:0{inst
)

NB. =========================================================
NB.*create v setup conversation
NB. form: service create topic
NB. returns 0
create=:4 : 0
if. 0=DDEINST do. ddesetup'' end.
DDECONV=:0
r=.>DdeConnect DDEINST;(DDEINST ddestringh x.);(DDEINST ddestringh y.);0
if. r=0 do. throw. DdeGetLastError DDEINST end.
DDECONV=:0{r
DDESERVICE=:x.
DDETOPIC=:y.
0
)

NB. =========================================================
NB.*destroy v cleanup dde, releasing the converation
NB. form: destroy ''
NB. returns ''
destroy=: 3 : 0
DdeDisconnect DDECONV
codestroy''
)

NB. =========================================================
NB.*ddecleanup v cleanup dde, releasing any converation(s) and data
NB. form: ddecleanup ''
NB. returns ''
ddecleanup=:3 : 0
destroy''
DdeUninitialize DDEINST
DDEINST_dmdde_=:0
)

NB. =========================================================
NB.*ddereq v initiate dde request with data
NB. form: ddereq data
NB. returns text vector response
ddereq=: 3 : 0
r=.>DdeClientTransaction 0;0;DDECONV;(DDEINST ddestringh y.);CF_TEXT;XTYP_REQUEST;1000;<<0
if. r=0 do. throw. DdeGetLastError DDEINST end.
hret=.0{r
'ra r rs'=.DdeAccessData hret;,0
if. r=0 do. throw. DdeGetLastError DDEINST end.
rv=.}:memr ra,0,rs
DdeUnaccessData hret
rv
)

NB. =========================================================
NB.*ddeex v initiate dde execute with data
NB. form: ddeex data
NB. returns response from DdeClientTransaction
ddeex=: 3 : 0
r=.>DdeClientTransactiona (y.,0{a.);(>:#y.);DDECONV;0;0;XTYP_EXECUTE;((DDESERVICE-:'iexplore'){1000,TIMEOUT_ASYNC);<<0
if. r=0 do. throw. DdeGetLastError DDEINST end.
r
)

NB. =========================================================
NB.*ddestringh v create ddeml string handle
NB. form: inst ddestringh data
NB. returns handle
ddestringh=: 4 : 0
r=.>DdeCreateStringHandle x.;(y.,0{a.);CP_WINANSI
if. r=0 do. throw. DdeGetLastError x. end.
r
)

NB. =========================================================
NB.*cdcallback v dll callback for ddeml
NB. form: cdcallback v
NB. returns 0
cdcallback=: 3 : 0
0
)