[Delphi] Checken of DDE server nog leeft

Pagina: 1
Acties:

  • Harmsen
  • Registratie: November 2000
  • Laatst online: 07:59
Hallo,

Ik heb een vraag over Dynamic Data Exchange (DDE) onder Delphi.
Zoals vele mensen vast wel weten zijn de componenten voor DDE in Delphi nou niet de meest uitgebreidde. Veel meer dan data uitlezen en schrijven kunnen ze niet. Nu is dit normaal geen probleem maar ware het niet dat ik graag meer wil.
Kon op GoT/Google niet zoveel vinden over DDE en Delphi, het meeste gaat over Visual Basic waar zo'n check al ingebouwd zit. een andere componentenset bestaan wel voor DDE dingen onder delphi (Klik) Maar deze krijg ik niet geinstalleerd. Daarom probeer ik hetzelf te maken.


Ik wil graag weten of een DDE server nog leeft, oftewel of hij nog wel data schrijft waar de DDE client bijkan. De DDE server kan ik qua source-code niet veranderen, anders had ik daar een extra veldje ingebouwd die om de zoveel seconden werd veranderd. Daarom ben ik gebonden aan de client.

Ik had zelf bedacht dat als ik een waarde in een veld uitlees, die opsla. Dan in datzelfde veld een vreemde waarde weer schrijf, die waarde weer uitlezen. Dan de 2 uitgelezen waardes vergelijken. Zijn die verschillend dan leeft de server nog, zijn ze hetzelfde dan doet de server niks meer.

De volgende code hoorde bij mijn gedachte:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function TForm1.CheckAlive: boolean;
var
 tempData1, tempData2: PChar;
 Data: array[0..79] of Char;
begin
  with DdeClientConv1 do
  begin
    DdeService := 'Excel';
    DdeTopic := '[Map1]Blad1';
    SetLink(DdeService,DdeTopic);
  ConnectMode := ddeAutomatic;
  end; 
  tempData1 := DDEClientConv1.RequestData('R1K1');
  tempData2 := tempData1;
  StrPCopy(Data, 'Woei');
  DDEClientConv1.PokeData('R1K1', Data);
  tempData1 := DDEClientConv1.RequestData('R1K1');
  if tempData1 <> tempData2 then
    result := true
  else
  begin
    result := false;
    DdeClientConv1.ConnectMode := ddeManual;
  end;
end;

Sorry voor de naamgeving (Form1, tempdata) maar het is maar een testprogje.

Nou ging dit vrij goed... yes dacht ik :) Het enige probleem is dat als de server(Excel in dit geval) gesloten wordt en dan deze functie uitgevoerd wordt, dat dan mijn progje een excecptie geeft. Dit is wel af te vangen dus okay.

Maar het volgende is dat als ik het progje gestart heb, zonder dat de DDEserver aanstaan, dan check of de server leeft, dan de DDEserver opstart en dan nog een keer een check uitvoer dat ie dan nog steeds vermeldt dat ie niet leeft :?

Wegens bovenstaande heb ik dus de ConnectModes erbij gezet, zodat het progje telkens opnieuw de link probeert te maken, dit werkte alweer wat beter maar nu komt het vreemde: Soms wil hij niet meer connecten, dat komt er weer een exceptie met het bericht dat de DDE-Server niet bestaat. En dit terwijl de Server wel aanstaan en dat de instellingen niet gewijzigd zijn.

Weet iemand een oplossing hiervoor??

What a fine day for Science! | Specs


Verwijderd

nee

modbreak: leukste thuis zeker? wil je voortaan smartass opmerkingen buiten de techfora houden als je niets nuttigs hebt toe te voegen?

[ Voor 97% gewijzigd door curry684 op 10-09-2003 17:01 ]


Verwijderd

Ik heb ooit eens een programma geschreven dat een DDE connectie legde met het Philips Digital Conferencing Network. Wat ik me nog kan herinneren is dat er een bepaald event werd afgevuurd op het moment dat de verbinding werd verbroken.

Over DDE is inderdaad niet zo heel veel te vinden, zeker omdat het een verouderde techniek is, die met de intreding van OLE helemaal naar de achtergrond is verdwenen.

  • Harmsen
  • Registratie: November 2000
  • Laatst online: 07:59
Klopt, als je Excel als voorbeeld van een DDEserver, normaal afsluit dan wordt het event OnClose gevuurd. Het probleem is dat als excel vastloop dat ie dat dan niet doet. Ik heb als test Excel laten vast lopen door veel berekeningen te laten doen (infinte loop :P )en tegelijk nog wat andere troep op deze pc. Hierna Excel afgesloten doormiddel van taakbeheer. Dan geeft hij de OnClose event niet jammer genoeg. Daarom heb ik geprobeerd een check te maken die elke minuut kijkt of hij nog wel actief is.

Het probleem is dat mijn progje moet kunnen werken met verschillende serverpakketten. Het enige wat al die serverpakketten allemaal ondersteunen is DDE. Ik heb al gekeken naar (D)Com, ActiveX, OLE en zo, maar helaas. Het wordt niet door alle pakketten ondersteund.

What a fine day for Science! | Specs


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Zoals gezegd is DDE een verouderde technologie en uitgaande van de ontwikkelingen in Windows zelfs antiek. Als je met een pakket moet samenwerken dat geen DDE ondersteunt, zou je je moeten afvragen of dat pakket niet ernstig aan vervanging toe is. De meest wijdverbreide moderne technologie om met servers samen te werken is OLE, waarvoor Delphi prachtige ondersteuning biedt. Er zijn zelfs speciale servercomponenten voor Office-onderdelen zoals Excel.

Helaas is dat geen oplossing voor jouw vraagstuk, maar ik ben bang dat een 'cleane' oplossing in DDE eenvoudigweg niet bestaat. Leve de vuile trucjes dan maar :P.

Een goede grap mag vrienden kosten.