3
« on: December 01, 2006 »
I found sintax , which is good for DDE library , here is my test program (tested with Facon sever, see above), both variants of POKE are working.
Hope this will be helpfull for someone:
#DEFINE WIN_INCLUDEALL
option explicit
#include once "windows.bi"
''#inclib "libuser32.dll"
'declare function setstateDDE(i as integer) as integer
declare function RETRIEVEmyDDEitem(byval itemname as string) as string
declare function DdeCallBack as PFNCALLBACK
declare function CHANGEmyDDEitem(byval itemname as string,byval newmydata as integer) as integer
dim shared state1 (0 to 30 ) as integer
dim shared i as integer
dim shared idInst as long
dim shared myhsz as HSZ,hszMYSERVER as HSZ,hszMYTOPIC as HSZ
dim shared hszMYITEM as HSZ
dim shared MYDDEservername as string
dim shared MYDDEtopicname as string, psz as string,MYDDEitemname as string 'LPTSTR
dim shared MYDDEconnection as HCONV
dim shared d1tmp as integer
dim shared d2tmp as integer
MYDDEservername="FaconSvr"
MYDDEtopicname="Channel0.Station1.Group0"
DdeInitialize(@idInst, DdeCallBack,CBF_FAIL_EXECUTES or CBF_SKIP_ALLNOTIFICATIONS,0)
hszMYSERVER=DdeCreateStringHandle(idInst,MYDDEservername,CP_WINANSI)
hszMYTOPIC=DdeCreateStringHandle(idInst,MYDDEtopicname,CP_WINANSI)
MYDDEconnection=DdeConnect(idInst,hszMYSERVER,hszMYTOPIC,NULL)
'================= d1
print "Retrieve:",RETRIEVEmyDDEitem("D1")
print "Retrieve:",RETRIEVEmyDDEitem("D2")
print "Retrieve:",RETRIEVEmyDDEitem("D1")
d1tmp=valint(RETRIEVEmyDDEitem("D1"))
d2tmp=valint(RETRIEVEmyDDEitem("D2"))
print "sleep1"
sleep
CHANGEmyDDEitem("D1",d1tmp+1)
CHANGEmyDDEitem("D2",d2tmp+2)
print "sleep2"
sleep
print "Retrieve:",RETRIEVEmyDDEitem("D1")
print "Retrieve:",RETRIEVEmyDDEitem("D2")
print "Retrieve:",RETRIEVEmyDDEitem("D1")
DdeDisconnect(MYDDEconnection)
DdeFreeStringHandle(idInst,hszMYSERVER)
DdeFreeStringHandle(idInst,hszMYTOPIC)
DdeUninitialize(idInst)
sleep
end
function DdeCallBack as PFNCALLBACK
print "MYCALLBACK"
return NULL
end function
'===========================
function RETRIEVEmyDDEitem(byval itemname as string) as string
dim md1 as HDDEDATA
dim mysize1 as integer
dim mystringresultptr as ubyte ptr
dim help1ptr as ubyte ptr
dim mystringresult as string
dim myres1 as long
MYDDEitemname=itemname
print "ASK="; MYDDEitemname
hszMYITEM=DdeCreateStringHandle(idInst,MYDDEitemname,CP_WINANSI)
md1=DdeClientTransaction( NULL,0,MYDDEconnection,hszMYITEM,CF_TEXT,XTYP_REQUEST ,110,@myres1)
mysize1= DdeGetdata(md1,NULL,0,0)
'print "returned data has size=",mysize1
mystringresultptr=allocate(mysize1)
help1ptr=mystringresultptr
DdeGetdata(md1,mystringresultptr,mysize1,0)
mystringresult=""
while (*mystringresultptr)<>0
mystringresult=mystringresult+chr(*mystringresultptr)
mystringresultptr+=1
wend
deallocate(help1ptr)
DdeFreeStringHandle(idInst,hszMYITEM)
DdeFreeDataHandle(md1)
return mystringresult
end function
'====================
function oldCHANGEmyDDEitem(byval itemname as string,byval newmydata as integer) as integer
dim md1 as HDDEDATA
dim md2 as HDDEDATA
dim md2ptr as HDDEDATA ptr
dim mysize1 as integer
dim mystringresultptr as ubyte ptr
dim help1ptr as ubyte ptr
dim mystringresult as string
dim myres1 as long
dim mystringptr as string ptr
dim mypbyte as PBYTE
MYDDEitemname=itemname
hszMYITEM=DdeCreateStringHandle(idInst,MYDDEitemname,CP_WINANSI)
mystringresult=""
mystringresult=str(newmydata)
'print mystringresult;"*"
mysize1=len(mystringresult)
mysize1+=1
mystringptr= Strptr(mystringresult)
mypbyte=cptr(PBYTE,mystringptr)
print "POKE TO="; MYDDEitemname, mystringresult
'successful POKE
md1=DdeClientTransaction(mypbyte,mysize1,MYDDEconnection,hszMYITEM,CF_TEXT,XTYP_POKE ,110,@myres1)
DdeFreeStringHandle(idInst,hszMYITEM)
return 0
end function
'========================
function CHANGEmyDDEitem(byval itemname as string,byval newmydata as integer) as integer
dim md1 as HDDEDATA
dim md2 as HDDEDATA
dim md2ptr as HDDEDATA ptr
dim mysize1 as integer
dim mystringresultptr as ubyte ptr
dim help1ptr as ubyte ptr
dim mystringresult as string
dim myres1 as long
dim mystringptr as string ptr
dim mypbyte as PBYTE
MYDDEitemname=itemname
hszMYITEM=DdeCreateStringHandle(idInst,MYDDEitemname,CP_WINANSI)
mystringresult=""
mystringresult=str(newmydata)
mysize1=len(mystringresult)
mysize1+=1
mystringptr= Strptr(mystringresult)
mypbyte=cptr(PBYTE,mystringptr)
print "POKE TO="; MYDDEitemname, mystringresult
md2=DdeCreateDataHandle(idInst,mypbyte,mysize1,0,hszMYITEM,CF_TEXT,0)
'successful POKE
md1=DdeClientTransaction(md2,-1,MYDDEconnection,hszMYITEM,CF_TEXT,XTYP_POKE ,110,@myres1)
DdeFreeDataHandle(md2)
DdeFreeStringHandle(idInst,hszMYITEM)
'DdeFreeDataHandle(md1) 'not needed i think
return 0
end function