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 :

Exemple de communication entre application C++ et Delphi


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Exemple de communication entre application C++ et Delphi
    Salut,

    Si quelqu'un a un exemple concret pour faire communiquer 2 applications C++ et Delphi. J'ai déjà regardé sur le forum et des articles sur google mais n'ai rien trouvé.

    J'ai déjà essayé avec WM_COPYDATA mais ça n'est pas abouti.

    Je veux transmettre cette Record ou structure de Delphi to C++ et C++ to Delphi.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TData = RECORD
        Nombre: Integer;
        Str: String[255];
        vBool: Boolean;
        pData: Pointer;
    END;

  2. #2
    Expert éminent sénior
    Tu pourrais nous fournir plus de code !

    C++ ? C++ Builder ?

    Evite String[255] qui contient la longueur en [0]
    Préfère array[0..255] of AnsiChar

    Préfère les types Windows, cela fait une référence commune

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TData = RECORD
        Nombre: DWORD;
        Str: array[0..255] of AnsiChar;
        vBool: BOOL;
        pData: Pointer;
    END;


    Code c++ :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct TData
    {
      DWORD Nombre;
      char Str[256]; // AnsiChar sous C++Builder
      BOOL vBool;
      void *pData;
    };


    Ensuite, tu fournis pData !
    C'est IMPOSSIBLE !

    C'est pourtant clairement écrit :

    Remarks

    The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.
    Il faut savoir que WM_COPYDATA ne copie pas vraiement ton struct depuis la mémoire d'un processus vers la mémoire de l'autre, j'ignore comment procède Windows mais il assure au moins l'accès en lecture juste le temps nécessaire, c'est d'ailleurs pour cela que c'est un message bloquant

    ton pData est théoriquement dans l'espace mémoire de l'appelant, le receveur n'a pas le "droit" de lire cette zone, c'est le WM_COPYDATA qui fait en sorte que cela fonctionne !


    Pourquoi ne pas utiliser les API Windows !
    Les Pipes
    Les MailSlot
    Le FileMapping
    Ou même du TCP\IP

    Quelques choses de plus universelles !
    C'est un sujet récurrent, je crois qu'il y a eu des tutoriels récents à ce sujet en Delphi, souvent adapté de la MSDN qui te fournira le code C++
    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

  3. #3
    Membre du Club
    J'ai déjà essayé avec mailslot mais vraiment lent, parceque dans le pData: Pointer, je transfert une image BGRA depuis Delphi vers c++ apres C++ renvoie vers delphi.
    Donc la fluidité est important.
    Je fait en Visual C++ 2010 et delphi XE2.

    Peut être que j'oriente vers socket c'est plus facile.

    Merci en tout cas.