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 : Sélectionner tout - Visualiser dans une fenêtre à part
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');