IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

DDECallback avec Delphi 7 sur win7 64 bits


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Santé

    Informations forums :
    Inscription : Février 2015
    Messages : 1
    Points : 2
    Points
    2
    Par défaut 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 : 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');

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je ne connais pas Delphi, mais ce qui m'interpelle ce sont les types handles dans les paramètres: Sont-ils déclarés par l'application ou l'environnement? Car dans le premier cas, il se pourrait qu'ils soient incorrects (les handles étant eux-mêmes souvent déclarés comme étant des pointeurs, dans Windows).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Je m'apprêtais un peu a répéter ce qui a été écrit sur Embarcadero Discussion Forums » Delphi » Native API !

    Pour répondre à Médinoc, il faut respecter dans son callback, le prototype de l'API : DdeCallback callback function
    Et OUI, les données sont fournies par l'OS, ce n'est pas la seule API qui retourne des Handles, faut juste les fermer en général, avec un CallBack pas besoin, c'est l'appelant qui se charge de tout donc l'OS

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HDDEDATA CALLBACK DdeCallback(
      _In_ UINT      uType,
      _In_ UINT      uFmt,
      _In_ HCONV     hconv,
      _In_ HSZ       hsz1,
      _In_ HSZ       hsz2,
      _In_ HDDEDATA  hdata,
      _In_ ULONG_PTR dwData1,
      _In_ ULONG_PTR dwData2
    );

    ce qui donne en Delphi XE2 qui gère déjà le 64Bits (voir l'unité DDEml et DdeMan),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function DdeMgrCallBack(CallType, Fmt : UINT; Conv: HConv; hsz1, hsz2: HSZ;
      Data: HDDEData; Data1, Data2: DWORD): HDDEData; stdcall;
    C'est exactement le code de vincdp

    Sinon pourquoi ne pas utiliser TDdeMgr ?
    N'existe-t-il pas en D7 ?

    De plus Delphi 7 génère un Exe 32 Bits, normalement l'OS lui envoie donc une structure de type 32 Bits! Du moins gère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    tagMONMSGSTRUCT = record
        cb: UINT;
        hWndTo: HWND; // ici c'est 4 ou 8
        dwTime: DWORD;
        hTask: THandle; // ici c'est 4 ou 8
        wMsg: UINT; // reste toujours à 4 !
        wParam: WPARAM; // ici c'est 4 ou 8
        lParam: LPARAM; // ici c'est 4 ou 8
        dmhd: TDdemlMsgHookData;
      end;

    Sinon, Est-ce que DDE est une ancienne technologie ? Difficile à dire, qu'Est-ce que le remplace ?
    Perso, DDE, je l'ai utilisé une fois et cela m'a gavé, je me suis fait ma petite classe maison pour gérer l'interprocessus de MES modules, sinon je me limite à la ligne de commande
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Installation Delphi 7 sur windows 64 bits
    Par Papyves dans le forum EDI
    Réponses: 6
    Dernier message: 10/06/2015, 11h59
  2. vb6 sur win7 64 bits
    Par diatta dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 22/10/2011, 23h01
  3. probleme avec les string sur ITA2 64 bits!
    Par vince3320 dans le forum SL & STL
    Réponses: 5
    Dernier message: 22/08/2005, 19h59
  4. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  5. Réponses: 5
    Dernier message: 24/04/2005, 04h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo