DDE Daten empfangen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

DDE Daten empfangen

Beitrag von EgonEprom »

Kleine Hilfestellung nötig! (habe weder in der Hilfe noch hier im Board etwas dazu finden können):
Ich habe ein Programm (unter Win2000) laufen, das per DDE-Schnittstelle (Dynamic Data Exchange) Daten zur Verfügung stellt. In Excel kann ich die Daten sehen, aber diese dort auszuwerten scheint mir unmöglich. Daher wollte ich es mit PureBasic versuchen.
Aber wie komme ich da an die Daten ran?

Danke vorab & mfg Egon Eprom
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: DDE Daten empfangen

Beitrag von mk-soft »

DDE ist zwar schon eine wenig Out. Aber wird teilweise immer noch verwendet.

Habe bei mir mal gesucht und folgendes von Rings gefunden.
Der Code enthält DDE-Server und Client. Zum testen einfach zwei mal starten...

Code: Alles auswählen

;DDE Server and Client in PureBasic
;(c)2002 by S.Rings (-CodeGuru-)
;
;Compile as exe and start twice or more   
;PureBasic 4.10 or better needed!

Global WhoIAM.s
Global DDEServerName.s
DDEServerName = "TestServer"
Global DDETopicName.s
DDETopicName = "PUREBASIC_DDE_TOPIC"
Global idInst.l
Global isRun.l

#XCLASS_BOOL = $1000
#XCLASS_NOTIFICATION = $8000
#XTYPF_NOBLOCK = $2
#XTYP_CONNECT = $60 | #XCLASS_BOOL | #XTYPF_NOBLOCK
#XTYP_DISCONNECT = $C0 | #XCLASS_NOTIFICATION | #XTYPF_NOBLOCK

#CP_WINANSI = 1004 ;' Default codepage For windows & old DDE convs.
#SW_RESTORE = 9
#DDE_FACK = $8000
#XCLASS_FLAGS = $4000
#XTYP_EXECUTE = $50 | #XCLASS_FLAGS
#DNS_REGISTER = $1
#DNS_UNREGISTER = $2
#CF_TEXT            =  1
#XTYP_POKE = $90 | #XCLASS_FLAGS

Procedure.s MySpace(Count.l)
Dummy.s="":For I=1 To Count:  Dummy.s=Dummy.s + " ":Next I:ProcedureReturn Dummy
EndProcedure

Procedure.l DDECallback(uType,uFmt, hConv , hszTopic, hszItem, hData,dwData1, dwData2)
   Shared DDETopicName
   Shared DDEServerName
   Shared idInst
   Shared WHOIAM
   
   ReturnValue=0;#DDE_FACK
   Select uType
      Case #XTYP_CONNECT
         iCount = DdeQueryString_(idInst, hszTopic, 0, 0, #CP_WINANSI);First Count Length of String
         Buffers.s = MySpace(iCount)
         DdeQueryString_( idInst, hszTopic, Buffers, iCount + 1, #CP_WINANSI)
         If Buffers = DDETopicName
         StartDrawing(WindowOutput(0))
         DrawText (10,10,Str(uFmt) +"..the client successfully connected..")
         StopDrawing()
         ReturnValue = #DDE_FACK
         EndIf
         
      Case #XTYP_DISCONNECT
         StartDrawing(WindowOutput(0))
         DrawText (10,70,"disconnected..")
         StopDrawing()
         ReturnValue = #DDE_FACK
      Case #XTYP_EXECUTE
         ReturnValue=0
      Case #XTYP_POKE
         iCount = DdeQueryString_(idInst, hszTopic, 0, 0, #CP_WINANSI);First Count Length of String
         Buffers.s = MySpace(iCount)
         DdeQueryString_( idInst, hszTopic, Buffers, iCount + 1, #CP_WINANSI)
         dummy.s= "Topic:" + Buffers
         StartDrawing(WindowOutput(0))
         DrawText (10,30,dummy)
         StopDrawing()
         
         iCount = DdeQueryString_(idInst, hszItem, 0, 0, #CP_WINANSI);First Count Length of String
         Buffers.s = MySpace(iCount)
         DdeQueryString_( idInst, hszItem, Buffers, iCount + 1, #CP_WINANSI)
         dummy="  Data::" + Buffers
         
         ReturnValue = #DDE_FACK
         StartDrawing(WindowOutput(0))
         DrawText (10,50,dummy)
         StopDrawing()
   EndSelect
   ProcedureReturn ReturnValue
EndProcedure


;-Attention Callbacks are  only working with Procedure for >3.1
MyCallBackAdress=@DDECallback();
If DdeInitialize_(@idInst, MyCallbackAdress, 0, 0)
   MessageRequester("Info","Failed:"+Str(idInst),0)
EndIf

hszServer = DdeCreateStringHandle_(idInst, DDEServerName, #CP_WINANSI)
If hszServer<>0
   hszTopic = DdeCreateStringHandle_(idInst, DDETopicName, #CP_WINANSI)
   If hszTopic<>0
      ;try To find the first instance, connect
      hconvServer = DdeConnect_(idInst, hszServer, hszTopic,  0)
      If hconvServer
         WhoIam="Client"
         MessageRequester( WHOIAM,"Server already started...",0)
      Else
         WHOIAM="Server":MessageRequester (WHOIAM,"attempt To start Server",0)
         Result=DdeNameService_( idInst, hszServer, 0,#DNS_REGISTER)
         If result=1
            isRun=1
         EndIf
            MessageRequester(WHOIAM,"Server started:"+Str(Result),0)
      EndIf
   EndIf
EndIf

If OpenWindow(0, 200, 200, 300, 200, WHOIAM, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
   If WhoIam="Client"
      If CreateGadgetList(WindowID(0))
         ButtonGadget(0, 10, 10,  72, 20, "Send")
      EndIf
   EndIf
   Repeat
      EventID.l = WaitWindowEvent()
      If EventID = #PB_Event_CloseWindow
         Quit = 1
      EndIf
      If EventID = #PB_Event_Gadget
         Select EventType()
            Case 0
               Message.s="-CodeGuru- was there"
               hItemMessage = DdeCreateStringHandle_(idInst, Message, #CP_WINANSI )
               If hItemMessage = 0
                  MessageRequester (WHOIAM,"Failed",0)
               EndIf
               myresult=0
               Result = DdeClientTransaction_(Message, Len(Message), hconvServer, hItemMessage, #CF_TEXT, #XTYP_POKE, 3000, @myresult )
               MessageRequester(WHOIAM,"Transaction:" +Str(Result)+":"+Str(myresult),0)   
               If Result <>0
                  DdeFreeDataHandle_(Result )
               EndIf
               Result=DdeFreeStringHandle_( idInst, hItemMessage)
            EndSelect
      EndIf
   Until Quit = 1
EndIf

Result=DdeFreeStringHandle_( idInst, hszServer)
Result=DdeFreeStringHandle_( idInst, hszTopic)

;only unregister the DDE server For first instance
If isRun
   Result=DdeNameService_(idInst, hszServer, 0, #DNS_UNREGISTER)
   MessageRequester( WHOIAM,"in ServiceUnRegister:"+Str(result), 0)
EndIf

Result=DdeUninitialize_( idInst)
MessageRequester(WHOIAM,"Ending:"+Str(Result),0)

End
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

Re: DDE Daten empfangen

Beitrag von EgonEprom »

Erst mal Danke für diesen prompten Service.

und was heißt hier "ein wenig Out"? gilt das für Windows 2000 noch nicht ?

Auf jeden Fall kann ich heute abend wohl noch einiges zu basteln, bis ich meine Daten sehe :)
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: DDE Daten empfangen

Beitrag von X360 Andy »

Hallo,

aus Interesse, was für Daten hast du damit vor auszuwerten ?

Gruß Andreas
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

Re: DDE Daten empfangen

Beitrag von EgonEprom »

Realtime Börsendaten :D
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: DDE Daten empfangen

Beitrag von X360 Andy »

Zwar nicht 100% realtime aber sowas würde man doch heute über eine normale API lösen ? ( XML ... )
Und diese halt dann mit den Netzwerk Befehlen auswerten, sowas finde ich persönlich konformer :)
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

Re: DDE Daten empfangen

Beitrag von EgonEprom »

Wie real-Time die Daten sind, weiß ich nicht. Aber man kann gut damit arbeiten und sie kosten nichts, ich nur irgendwie mit dem DDE-Server leben, von dem sie kommen. Ansonsten sei noch zu erwähnen, daß ich von Windows-Programmierung eigentlich gar keine Ahnung habe !?!
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: DDE Daten empfangen

Beitrag von X360 Andy »

Ich meinte den Realtime abgleich, ich weiß nicht genau wie DDE Server funktionieren, deswegen das mit dem realtime.

Bei der ( angesprochen ) API Methode müsste man dann natürlich alle paar Minuten kontrollieren ob es neue Daten gibt, das meinte ich mit realtime.
Benutzeravatar
EgonEprom
Beiträge: 24
Registriert: 15.02.2010 18:18
Computerausstattung: Windows2000-XP-Vista-7
Wohnort: Saarwellingen

Re: DDE Daten empfangen

Beitrag von EgonEprom »

Zur Realtime-Frage: Minuten sind da jenseits von gut & böse: Im Excel sehe ich mitunter 4 bis 4 update der Daten pro Sekunde; wie stark der zeitliche Versatz von "Quell-Fenster" zum Excel ist, kann ich nicht mit hinreichender Genauigkeit bestimmen, daß diese Aussage sinn macht. Für manuellen Betrieb eben sauschnell.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: DDE Daten empfangen

Beitrag von X360 Andy »

Wenn du gute Rechner und schnelle Computer zu Auswertung hast und die Börsen API auch schnell ist sollte man auch hier mehrene Updates per Sekunde hinkriegen.

Hier ein Link zu dieser API der DB
http://deutsche-boerse.com/dbag/dispatc ... Values_API

Warscheinlich gut kommentiert das ganze, trotzdem scheint es relativ komplex zu sein :)

Denke eher dass das hier das richtige sein sollte.
http://deutsche-boerse.com/dbag/dispatc ... ons/51_CEF
Antworten