The following program creates a DDE service in an instance of dBASE Plus. This server handles information passed to it from multiple DDE clients, including those set up in the dBASE Plus application (using a separate dBASE Plus instance) and Microsoft Word macro shown in the class DDELink example.

set procedure to program(1) additive

_app.ddeServiceName = "STOCKSERVER"

_app.onInitiate = InitStockDDE

_app.framewin.text = "Stock Server 2000"

? "Ready for DDE server requests for:", _app.ddeServiceName

function InitStockDDE(newTopic)

// DDETopic object not in memory, create it 

local x 

x = new StockDDETopic(newTopic) 

? "Initialized server for topic:", newTopic 

return x // Must return requested topic 

class StockDDETopic(t) of DDETopic(t)

this.adviseList = new AssocArray() 

this.value = 100 

function onAdvise(item) 

? this.topic, "ADVISE on changes in:", item 

this.adviseList[ upper(item) ] = null // Create element with dummy value 

function onExecute(cmd) 

? this.topic, "EXECUTE:", cmd 

// This server does not support any commands 

function onPeek(item) 

? this.topic, "PEEK:", item 

return this.value 

function onPoke(item /* Buy or Sell */, value /* Shares */ ) 

? this.topic, "POKE:", item, value 

if upper(item) = "SELL" 

this.value -= val(value) 

elseif upper(item) = "BUY" 

this.value += val(value) 

endif 

// Notify clients if item in adviseList 

if this.adviseList.isKey(upper(item)) 

? this.topic, "NOTIFY change in:", item 

this.notify(upper(item)) // Implicitly calls onPeek to get value 

endif 

? "Value is now:", this.value 

function onUnadvise(item) 

if this.adviseList.isKey(upper(item)) 

? this.topic, "cancel ADVISE on changes in:", item 

this.adviseList.removeKey(upper(item)) 

endif 

endclass