DDECallback avec Delphi 7 sur win7 64 bits
J'ai un problème avec une fonction DDECallback dans une ancienne application, qui devrait tourner sur des machines Windows 7 64 bits.
Cette fonction (écrite il y a longtemps par un développeur qui n'est plus dans la maison) utilise des pointeurs, et comme chacun sait, la gestion des pointeurs n'est plus la même sous 64 bits.
L'application doit attendre qu'une opération exécutée par l'application serveur DDE (pas Delphi) soit terminée.
Les tests sur TMonMsgStruct(pData^).wMsg et WM_DDE_ACK et WM_DDE_TERMINATE ne fonctionnent plus.
Quelqu'un peut-il m'aider avec une fonction DDECallback écrite pour un environnement 64 bits ?
Note: je sais que DDE est une ancienne technologie, mais pour le moment, je ne peux pas faire autrement :-\
Merci !
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| function SVDdeCallBack(
CallType, Fmt : UINT; //transaction type ; format atom of the data sent from the server
Conv: HConv; //a handle the conversation
hsz1, hsz2: HSZ; // hsz1: topic name ; hsz2: item name
Data: HDDEData; //a handle to the data associated with the topic and item name pair
Data1, Data2: DWORD) //
: HDDEData; stdcall;
var
pData: Pointer;
Len: Integer;
begin
Result := 0;
// Check if the calltype is the monitoring DDE call
if CallType = XTYP_MONITOR then
begin
// Get the DDE data
pData := DdeAccessData(Data, @Len);
// Je reçois une valeur totalement différente sur une machine 32 bits
if pData <> nil then
begin
// If data is a posted message
if Data2 = MF_POSTMSGS then
begin
try
// Check if the message was an acknowledge message
if TMonMsgStruct(pData^).wMsg = WM_DDE_ACK then
begin
// Detect only the acknowledge messages with no busy flag
if ((TMonMsgStruct(pData^).dmhd.uilo and DDE_FACK) = DDE_FACK) and
((TMonMsgStruct(pData^).dmhd.uilo and DDE_FBUSY) = 0) then
begin
// The DDE command has terminated
// ApplData.Waitstat is a "global" variable in the application
ApplData.WaitStat := False;
end
else
begin
// Acknowledge with BUSY Flag <> 0'
end;
if TMonMsgStruct(pData^).wMsg = WM_DDE_TERMINATE then
begin
//DDE_terminate message'); |