Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Kurze Hilfestellung bei Funktionsaufruf für DDE benötigt (https://www.delphipraxis.net/189520-kurze-hilfestellung-bei-funktionsaufruf-fuer-dde-benoetigt.html)

st.w 21. Jun 2016 09:00

Kurze Hilfestellung bei Funktionsaufruf für DDE benötigt
 
Hallo Mehr-Wissende,

ich muß mein (DELPHI 4)-Programm an ein Fremd-Messprogramm anbinden, das dafür nur eine DDE-Schnittstelle anbietet.
Diese Anbindung funktioniert nicht unter der von mir schon früher erfolgreich verwendeten unit DDEMan (TDdeClientConv / TDdeClientItem)-Funktionanlität - leider keine Anbindung per SetLink/OpenLink möglich.

Nach langem Suchen habe ich eine Lösung gefunden, die zumindestens per Debuggerdurchsteppen mit dem Messprogramm konnektiert!
Auch der .Execute-Befehl meldet keinen Fehler laut Debuggerdurchsteppen.

Ich bin in Delphi-Programmierung (noch) nicht so tief bewandert, dass ich das Auslesen mit den Funktionen der Unit DDEObjec umsetzen könnte.

Meine Frage: Wie lese ich ein dokumentiertes DDEItem 'Measure', dem ein Marco 'GetMeasure' uzugeordnet ist, aus?

Wie lautet ein Funktionsaufruf dafür konkret? Wie komme ich an den Wert von hData:hDDEData, wenn ich die von mir favorisierte Funktion GetDataAsStrObj(..) nutzen wollte? Oder ist eine andere Funktion richtiger?

Bitte helft mir - Ich habe schon alle meine Tricks angewandt und alles abgegooglet...

Danke Euch vorab,
Stefan


Der Code aus letztem Beitrag aus: http://www.delphipraxis.net/84293-dd...temchange.html

st.w 21. Jun 2016 09:03

AW: Kurze Hilfestellung bei Funktionsaufruf für DDE benötigt
 
Hier ein Ausschnitt aus dem Code - Leider klappt die Code-Formattierung bei mir nicht...


unit Unit1;
...
uses ..., DDEObjec, DDEML;

type
TForm1 = class(TForm)
...
private
public
end;

function DdeDataChange(CallType, Fmt: UINT; Conv: HConv; hsz1, hsz2: HSZ; Data: HDDEData; Data1, Data2: DWORD): HDDEData; stdcall;
var Form1: TForm1;
implementation

{$R *.DFM}

var count: Integer = 0;
dde: TDDEMLClass;

function DdeDataChange(CallType, Fmt: UINT; Conv: HConv; hsz1, hsz2: HSZ; Data: HDDEData; Data1, Data2: DWORD): HDDEData;
var str:String;
begin
dde.GetDataAsStrObj(data, str);
Form1.Memo1.Lines.Add(str);
//result := data; eine Result darf ich nicht zurückgen, der DDE-Server meldet sonst einen Timeout?!?
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
dde := TDDEMLClass.Create(DDEDataChange, 0);
dde.Connect(PAnsiChar(edtService.Text), PAnsiChar(edtTopic.Text));
dde.Execute(PAnsiChar(edtMacro.Text));

// HIER BRAUCHE ICH DIE FUNKTIONSAUFRUFE
end;
end.


// Der Anfang der Unit DDEObjec:


{+------------------------------------------------------------
| Unit DDEObjec
| Version: 2.0 Created: 12/18/96, 12:58:02 Last Modified: 12/18/96, 12:58:02
| Author : P. Below
| Project: Common utilities
| Description: Simple DDEML interface for Delphi 2.0
+------------------------------------------------------------}
Unit DDEObjec;

Uses Windows, DDEML, SysUtils, ErrClass;

Type
EDDEMLException = Class( Exception );

TDDEMLClass = Class( TErrClass )
private
f_Inst: LongInt; (* ddeml instance *)
f_Conv: HConv; (* conversation handle *)
f_Server: HSz; (* server name string handle *)
f_Topic : HSz; (* topic name string handle *)
f_Timeout: LongInt; (* timeout for transactions *)
f_LastResult: LongInt; (* last transaction result *)
f_LastError : LongInt; (* last dde error status *)
f_CallbackInst: TFNCallback; (* callback for this instance *)
f_codepage : Integer; (* default code page to use *)

protected
public
Constructor Create( aCallback: TFNCallback; flags : LongInt );
Destructor Destroy; override;

Function MakeHSz( aStr: PChar ): HSz;
Procedure FreeHSz( Var aHSz: HSz );
Function CompareHSz( HSz1, HSz2: HSz ): Integer;
Function QueryHSz( aHSz: HSz; Var aStrObj: String ): Boolean;

Function Connect( aServer, aTopic: PChar): Boolean;
Procedure Disconnect;
Function ClientTransaction( pServerData: Pointer; dataSize: LongInt; Item: HSz; Format, DataType: UINT ): HDDEData;
Function Request( Item: PChar; Format:UINT ): HDDEData;
Function Execute( command: PChar ): Boolean;
Function GetData( hData: hDDEData; buf: Pointer; bufSize, offset: LongInt ): LongInt;
Function GetDataAsStrObj( hData: hDDEData; Var aStrObj: String ): Boolean;
Procedure FreeDatahandle( hData: hDDEData );
Function CreateDataHandle( source: Pointer; len, offset: LongInt; item: HSz; Format, Command: UINT): hDDEData;
Function AddData( data: hDDEData;source: Pointer; len, offset: LongInt ): hDDEData;
Function AccessData( data: hDDEData; DataSize: PDWORD ): Pointer;
Procedure UnaccessData( data: hDDEData );

Function IsConnected: Boolean;
Function IsValid: Boolean;

Procedure DDE_Error;
Procedure SetDDE_Error( err: Longint );

property Timeout: LongInt read f_timeout write f_timeout;
property LastDdeError: LongInt read f_lasterror;
property LastDdeResult: LongInt read f_lastresult;
property Server: HSz read f_server;
property Topic: HSz read f_topic;
property Codepage: Integer read f_codepage write f_codepage;

End;
...

st.w 22. Jun 2016 10:14

AW: Kurze Hilfestellung bei Funktionsaufruf für DDE benötigt
 
Hallo Mehr-Wissende,

ich als "Thema poster" realisiere gerade, dass der von MIR gepostete Code als Antwort mißverstanden werden könnte.

ALSO: Bitte helft mir bei dem Code zum Funktionsaufruf für die DDE-Abfrage, den ich immer noch verzweifelt versuche zu programmieren - Danke!

Gruß
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz