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

MFC Discussion :

Intégrer du MFC dans un projet qui n'en a pas. c'est possible?


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut Intégrer du MFC dans un projet qui n'en a pas. c'est possible?
    Bonjour à tous,

    je viens vers vous car je débute avec la programmation Windows et je me trouve pris par le temps.

    Je vais tacher de vous résumer ma situation et mon environnement de travail en espérant être assez clair. Ne sachant pas tout les éléments qui pourraient vous être utile, je vous pris de ne pas hésiter à me solliciter pour avoir des précisions sur des options, des copies d'écran ou autre.

    Pour mieux me situer, j'ai repris des études et je dois réaliser un projet de dév. Mes cours n'ont pas été spécifiquement orienté technologie Microsoft et environnement Windows. C'est une formation assez généraliste qui donne un aperçu de plusieurs langage de dév, des bases de données, du SI, ....

    Mon projet m'a été fourni par une entreprise d'imagerie médicale qui souhaite ajouter la prise en charge d'un nouveau matériel à son logiciel maison. Pour cela, l'entreprise m'a fourni les éléments suivant :
    - Librairie Qt à compiler sur notre poste en v4.7
    - Librairie OpenCV v2.2 (pour le traitement d'image)
    - Librairie dcmtk v3.5.4 (manipulation norme DICOM)
    - Langage C++
    - IDE : Visual Studio 2010 Express
    - le nouveau matériel est fourni avec un SDK comprenant dll, .cpp et .h pour accès à la dll et une appli démo avec ses sources.

    Mon problème : n'arrivant pas à compiler un programme de test pour appeler la dll, j'ai perdu du temps à comprendre qu'elle utilise les librairie MFC. Ensuite j'ai également perdu du temps à comprendre que la version Express de Visual ne gère pas les MFC. Ce point à été réglé en passant à la version Visual Studio Pro.

    Néanmoins, je n'arrive pas à compiler car je ne sais pas comment faire pour intégrer dans un simple projet en C++ des éléments de classe MFC?
    Dois-je changer des paramètres au projet Visual ou bien faire l'ajout de .h ou bien les 2?
    Mais la réponse est peut-être que c'est impossible?....

    Voilà, je me noie sous la documentation qui me parle de MFC pour faire de jolie application fenêtrée mais moi je n'ai pas besoin de l'affichage de la fenêtre (il y a Qt) donc je ne trouve pas de réponse pour régler mes problèmes d'intégration/compilation.

    Merci d'avance pour être arrivé à lire jusqu'à cette ligne et encore plus de merci si vous pouvez m'aider/m'orienter pour trouver une solution

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je dirais que ça dépends de quelles parties de MFC sont utilisées par le code que tu veux ajouter à ton application...
    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
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 564
    Par défaut
    Bonjour.

    Il nous faut un minimum d'infos pour t'aider, par exemple quelles sont les erreurs lors de la compilation et le code minimaliste de ton test. Je confirme les dires de Médinoc, si tu n'utilises pas de classes MFC il n'y a aucune raison d'inclure les entêtes dans ton projet en revanche tu devras modifier les propriétés de ton projet pour lui dire d'utiliser les MFC ainsi que les différents dossiers (include, lib).

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Je confirme les dires de mes voisins du dessus.
    Mais je voudrais ajouter ma pierre au questionnement.
    Vous indiquez que l'exemple fourni dans le SDK utilise les MFC, mais il y a une chose très importante à savoir dés le début :
    Est-ce que la Dll a besoin des MFC ?
    Si ce n'est que le programme de test qui à besoin des MFC, vous n'avez pas besoin de vous embêter avec les MFC. Faire cohabiter les MFC et Qt est une tâche qui potentiellement est très complexe voir impossible.
    La documentation du SDK devrait indiquer la dépendance aux MFC, et à quelle version, si c'est la dll qui est dépendante des MFC.
    Si vous avez des extraits du code qui correspondent a l'utilisation des fonctions de la Dll, cela permettrait de savoir si c'est la Dll ou l'exemple qui a besoin des Dll.
    Vous pouvez utiliser dependency walker (http://www.dependencywalker.com/)pour savoir si la Dll depend fortement des MFC.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Bonjour,

    merci de vos retour et mes excuses du retard pour répondre mais d'autre priorité mon occupé entre temps (des exams par exemple )

    Voici une partie du fichier .h qui me pose soucis et particulièrement une ligne :
    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
     
    /** *************************************************************** **
     **          Radiography Detector: application interface            **
     **  (c) VATech                                         by S.B.     **
     **  initial release: July-2007                                     **
     **  recent edition : Sept-2008                                     **
     ** *************************************************************** **/
     
    #ifndef VADAVINTF_H_INCLUDED
    #define VADAVINTF_H_INCLUDED
      ////// acquisition //////
     
    ////  Je passe le code qui ne pose pas de souci //////
     
      typedef struct {         // Custom information record
    	  int  rNumReceivedRows, // acquisition uses this field to print messages
    		  rComplete;        // indicates that caller terminates (by some reason) and expects "close"
    	  // the possible reasons are: 'complete', 'error' or 'abort'
    	  int rCalMode;
    	  CWnd *rhWnd;
      } tCallBackRec;
     
      // callback procedure  
      typedef void (_stdcall *tVDC_CallBackProc)( tVDC_CallBackRec* );
     
    ///// Je vous épargne le reste du code
    Si mes recherches sont bonnes ma structure ci-dessus contient le type CWnd qui correspond à un objet MFC, selon MSDN : "Fournit les fonctionnalités de base de toutes les classes de fenêtres dans la bibliothèque MFC".
    Lors de la compilation de mon projet Qt, le compilateur me dis qu'il manque un ';' après 'CWnd *'. La structure est utilisée pour communiquer des informations entre le capteur et mon "futur" programme mais je ne pense pas que la dll s'amuse à afficher des fenêtres

    Ci-dessous, l'entête du fichier cpp le reste du code ne me semble pas pertinent pour le moment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /** *************************************************************** **
     **          Radiography Detector: application interface            **
     **  (c) VATech                                         by S.B.     **
     ** *************************************************************** **/
     
    #include "stdafx.h"
    #include "windows.h"
    #include "tchar.h"
    #include "VADAVIntf.h"
    Voici mes étapes de travail pour testé la librairie avec Qt.
    J'ai installé Qt sous Visual 2010 en suivant le tuto de Xavinou http://qt.developpez.com/tutoriels/e...l-studio-2010/.
    J'ai repris le projet test et seulement ajouté le .h et le .cpp au projet.
    Il s'agit d'un projet de type 'makefile' et la compilation est tombé en erreur en me disant parmi les erreur qu'il manque un ';' après 'CWnd *'.

    J'ai créé un projet "hello world" sous Visual de type MFC, j'y ai ajouté le .h et le .cpp et là j'ai pus compiler. En voulant jouer sur les propriétés des projets MFC et 'makefile' je me rend compte que les options disponibles ne sont pas les mêmes. Il faut sûrement ajouter des lib et includes mais je ne sais pas lesquels.

    Pour la documentation du SDK, la seul infos à ma disposition est la suivante :
    This library (and demo projects) is originally written in “ MS Visual C 6.0 ”. That old IDE (Integrated Developers’ Environment) was used for fast installation for debug when required. Release version built by “MS Visual Studio 2005” (that improves 2-5% speed of calibration and image processing). Supplementary projects are for “VC 6.0” or “VS 2005” (they exist in directories with extension “.VC8”). MFC is built-in as static library.
    J'espère avoir précisé un peu les choses, pour les msg d'erreurs je compléterai un peu plus tard car je n'ai pas la machine sous la main au moment où je saisi ces lignes.

    Encore merci de votre aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Houlà, mélanger des CWnd* (l'essence de l'interface graphique dans MFC) avec des fenêtres QT, ça s'annonce très mal. QT est censé faire abstraction de l'API Windows, alors que MFC l'embrasse complètement...
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    C'est également mon avis.
    Néanmoins, je pense que la structure n'est pas utilisé par la dll pour ouvrir des fenêtre mais seulement transférer des informations (me demandez pas lesquelles SVP ) et lors de mes recherches j'ai lus quelques infos concernant la technique des wrappers. J'ai bien compris qu'il s'agit en général d'embarquer du C++ dans un programme en C# ou en Python ou dans un autre langage, mais cette technique pourrait-elle être utilisé dans mon cas? (du C++ encapsulé pour être appelé par du C++... c'est peut-être pas commun )

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Vous avez répondu à pas mal de mes questions.
    Et malheureusement, ces réponses ne font qu'assombrir le paysage.

    Je partage le pessimisme de Médinoc.

    Ce n'est pas impossible que cela fonctionne, mais si cela fonctionnera, ça sera aux forceps.

    Toutes les remarques et assertions que vous indiquez sont bonnes.

    Pour simplifier la situation, avec vous les sources de cette librairie et êtes vous en mesure dans faire une version compilée avec votre VS ?

    Si oui, cela permettrait d'éviter des problèmes de compatibilité avec d'ancienne C-Runtime.
    Sinon, faudra russé.

    je pense que la structure n'est pas utilisé par la dll pour ouvrir des fenêtre mais seulement transférer des informations
    Si c'est pas le cas, on est encore plus dans la moïse.

    Je vois 2 approches:

    -Soit intégrer les MFC dans votre application juste accès pour pouvoir instancier une CWnd qui ferait passe-plat vers vos objets Qt
    -> Avantages : Plus de change de répondre correctement aux sollicitations de la Dll.
    -> Inconvénients : Plus de problèmes potentiels avec Qt, il faudra gruger le code des MFC pour ne pas entrer en collision avec Qt.

    -Soit créer une classe CWnd de toutes pièces et fabriquer tout ce qui est nécessaire à son utilisation par la Dll.
    -> Avantages : On ne doit pas intégrer, peu ou prou, les MFC, donc moins de problèmes potentiels avec Qt.
    -> Inconvénients : Beaucoup plus de travail d'émulation du comportement des MFC, si la Dll s'en sert.

    Le second approche est peut-être à privilégier dans un premier temps, en espérant une faible intégration entre les MFC et la Dll.

    Vous ne nous avez pas donné toute l'API, nous ne sommes donc pas en mesure de dire si la Dll et l'exécutable sont étanche d'un point de vue mémoire.
    Si ce n'est pas le cas, il faudra prendre la même C-Runtime que celle qui a servi à créer la Dll.

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 564
    Par défaut
    Bonsoir, je confirme les dires de mes collègues. De plus je dirais que ça sent pas très bon

    La librairie fournie avec votre sdk est compilée (mode debug et release) avec des versions différentes des MFC qui sont elles-même différentes des MFC de visual studio 2010 ce qui implique des problèmes de compatibilité inévitable.

    Avant d'aller plus loin, concentrez vous sur l'utilisation de votre dll ou plutôt son intégration dans un petit programme de test sous visual studio 2010. Lisez bien la doc, elle vous fournira normalement des infos importantes sur son utilisation. Si vous n'avez pas les sources pour recompiler cette dll avec votre votre version de visual studio, procurez vous le package redistribuable de la version 2005 https://www.microsoft.com/fr-fr/down...s.aspx?id=3387 pour installer les composants nécessaires à l'utilisation de votre dll (CRT, MFC, ALT ...) et utilisez les méthodes standard de chargement dynamique http://cpp.developpez.com/faq/vc/?pa...-dynamiquement

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peut-être serait-il possible de mettre une DLL intermédiaire entre les deux, une qui n'utiliserait MFC qu'en interne et n'exposerait rien qui ait trait à MFC dans son interface?
    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.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Merci à vous tous de vos réponses.

    @bacelar : je ne dispose pas, malheureusement pour moi, des sources de la dll. Finalement le SDK ne regroupe que 3 fichiers à utiliser intitulé VADAVIntf.h, VADAVIntf.cpp et VADAV.dll.

    @ddaime : la doc... je ne sais pas comment la considérer... elle fait 12 pages et les quelques informations la décrivant tiennent dans la citation suivante, le reste est une succession de fonctions avec une brève description regroupé selon l'utilisation faite du matériel.
    1.1. Supported IDEs and Character Sets
    This library (and demo projects) is originally written in “ MS Visual C 6.0 ”. That old IDE (Integrated Developers’ Environment) was used for fast installation for debug when required. Release version built by “MS Visual Studio 2005” (that improves 2-5% speed of calibration and image processing).
    Supplementary projects are for “VC 6.0” or “VS 2005” (they exist in directories with extension “.VC8”).
    MFC is built-in as static library.

    All projects (and library’s source itself) use TCHAR and respective macros. They use neither “char” nor “wchar” explicitly (except for communications with firmware through RS-232 and Ethernet). So library could be easily switched between UNICODE and Multi-Byte characters. Basically the library comes as Multi-Byte. Request UNICODE version if you need that.

    Note: under the unicode environment, use VADAV_Unicode\VADAV.DLL and VADAVIntf.cpp with “#define UNICODE”

    1.2. Files
    You have to include the next 2 files in your project (it must necessarily allow “TCHAR”):
    VADAVIntf.h – interface declarations
    VADAVIntf.cpp – implements supplementary interface’s loader
    Je pense qu'il y a dans cette première partie des informations utiles pour savoir peut-être comment orienter ma recherche mais je n'ai pas l'expérience des développements avec Visual pour percevoir les conséquences qu'implique les différences de versions de Visual.

    Entre temps, ayant compris que je manipulais une dll avec des MFC j'ai fais un projet "hello world" sous Visual Studio mais cette fois en version Pro, j'ai pus choisir le type de projet MFC et choisir dans les propriétés les options qui vont bien pour compiler

    Et j'en suis là : j'ai un projet test pour Qt de type "makefile" qui compile et fonctionne ainsi qu'un un projet test pour MFC type "application MFC" qui compile et fonctionne mais je ne vois vraiment pas comment fusionner les deux.

    Concernant le chargement dynamique de la dll, je ne sais pas si la précision que vais vous donner peut-être utile mais cela me permet de vous expliquer comment elle devrait être manipulé.
    Le matériel d'imagerie médicale dispose d'un outil de calibration que l'on doit installer sur le pc. La dll est alors copiée lors de l'installation. Pour que mon programme puisse utiliser les fonction de la dll, je dois faire appel à une fonction, VADAV_MapDLL(), déclarer dans VADAVIntf.h qui (si j'ai bien compris) charge ou mappe les fonctions contenuent dans la dll au sein d'une structure (type tVADAV_InterfaceRec). Et histoire de charger ma réponse voici une copie de VADAVIntf.h, la fonction et la structure sont en fin de fichier.
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    /** *************************************************************** **
     **          Radiography Detector: application interface            **
     **  (c) VATech                                         by S.B.     **
     **  initial release: July-2007                                     **
     **  recent edition : Sept-2008                                     **
     ** *************************************************************** **/
    #include <afxwin.h>
     
    #ifndef VADAVINTF_H_INCLUDED
    #define VADAVINTF_H_INCLUDED
      ////// acquisition //////
      // acquisition flags
      #define cVDACQ_FDark         0       // acquire Dark frame (dark otherwise)
      #define cVDACQ_FBright       1       // acquire bright frame (dark otherwise)
      #define cVDACQ_FTestPat      2       // acquire test pattern  /TFT only
      #define cVDACQ_FRecentFrame  4       // retrieve recent frame /TFT only
      #define cVDACQ_FBrightIgn   (1<<31)  // ignore state of the bit 'Bright' /TFT only
      //  #define cVDACQ_FI_Bright61  (1<<31)  // 'bright61' /USB only
      // acquisition event types
      #define cVDACQ_ETTrace       0
      #define cVDACQ_ETTraceT      1
      #define cVDACQ_ETErr         2
      #define cVDACQ_ETLastErr     3
      #define cVDACQ_ETWSAErr      4
      // acquisition events
      #define cVDACQ_EAbort        1
      #define cVDACQ_EClose        2
      #define cVDACQ_ECapture      20
      #define cVDACQ_ECapturePerc  21
      #define cVDACQ_ECaptureRecv  22
     
      // acquisition feedback record   
      typedef struct {
        int    rFlags,            // combination of cVDACQ_Fxxxx
               rType,             // cVDACQ_ETxxx
               rEvent,            // cVDACQ_Exxx
               rSocket;           // 0:no socket relation; otherwise socket's ID >0 
        TCHAR  rMsg[256];         // message (trace, wrn, err)
        int    rFrameWidth,       // full frame width
               rFrameHeight;      // full frame height
        short *rFrameBuffer;      // user supplied frame buffer "AFrameBuffer"
        int    rCaptureRows,      // # of received rows
               rCapturePercent;   // received data in percents
        void  *rUserCallBackProc, // user supplied "ACallBackProc"
              *rUserParam;        // user supplied "AUserParam"
        int    rAborted;          // 1: VDACQ_Abort -1:internally
        void  *rPacketData;       // pointer to received packet; usually it is nil  
      } tVDACQ_CallBackRec;
        // socket's id #1: control-write UDP
        //             #2: control-read UDP
        //             #3: data TCP socket
        // When callback is triggered by received message from detector it has non-nil field
        // PacketData. Normally an OEM application does not check received packets directly.
     
      // callback procedure  
      typedef void (_stdcall *tVDACQ_CallBackProc)( tVDACQ_CallBackRec* );
     
      ////// calibration //////
      // calibration flags
      #define cVDC_FCalOffs      1
      #define cVDC_FCalGain      2
      #define cVDC_FANoisRem     4
      #define cVDC_FBadPixMap    8
      #define cVDC_FDespeckle   16
      #define cVDC_FAVSmooth    32
      #define cVDC_FChkHWDark   (1<<30)  // check if recennt dark-frame is auto-calibrated
      #define cVDC_FTempDirIP   (1<<31)  // save temporary images in default image direcotory
      // calibration event types
      #define cVDC_ETTrace       0
      #define cVDC_ETTraceT      1
      #define cVDC_ETErr         2
      // calibration events
      #define cVDC_EAbort        1
      #define cVDC_EClose        2
      #define cVDC_ECalib        20
      #define cVDC_ECalibPerc    21
      // calibration feedback record   
      typedef struct {
        int    rFlags,            // combination of cVDC_Fxxxx
               rType,             // cVDC_ETxxx
               rEvent;            // cVDC_Exxx
        TCHAR  rMsg[256];         // message (trace, wrn, err)
        int    rFrameWidth,       // full frame width
               rFrameHeight,      // full frame height
               rStoredWidth,      // stored image width
               rStoredHeight,     // stored image height
               rCalibPercent;     // processed data in %
        short *rFrameBuffer,      // received frame data
              *rImageBuffer;
        void  *rUserCallBackProc, // user supplied "ACallBackProc"
              *rUserParam;        // user supplied "AUserParam"
        int    rAborted;          // 1: set by VDC_Abort; -1:internally
      } tVDC_CallBackRec;
     
      typedef struct {         // Custom information record
    	  int  rNumReceivedRows, // acquisition uses this field to print messages
    		  rComplete;        // indicates that caller terminates (by some reason) and expects "close"
    	  // the possible reasons are: 'complete', 'error' or 'abort'
    	  int rCalMode;
    	  CWnd *rhWnd;
      } tCallBackRec;
     
      // callback procedure  
      typedef void (_stdcall *tVDC_CallBackProc)( tVDC_CallBackRec* );
     
      typedef struct {
        int  rImgCutLeft,          // cut left after rotation & flip 
             rImgCutTop,           // cut top after rotation & flip
             rImgCutRight,         // cut right after rotation & flip
             rImgCutBottom,        // cut bottom after rotation & flip
             rRotation,            // 0:none, 1:90 deg CCW, 2:90 deg CW
             rFlip;                // bit #0: flip horz, bit #1: flip vert 
      } tVDC_ImgCut;
     
      ///// image process /////
      // img process flags
      #define cVDIP_FDespeckle    1
      #define cVDIP_FAVSmooth     2
      #define cVDIP_F3PCurve      4
      #define cVDIP_FUSMask       8
      // img process event types
      #define cVDIP_ETTrace       0
      #define cVDIP_ETTraceT      1
      #define cVDIP_ETErr         2
      // img process events
      #define cVDIP_EAbort        1
      #define cVDIP_EClose        2
      #define cVDIP_EEnh          20
      #define cVDIP_EEnhPerc      21
      // img process feedback record   
      typedef struct {
        int    rFlags,            // combination of cVDC_Fxxxx
               rType,             // cVDC_ETxxx
               rEvent;            // cVDC_Exxx
        TCHAR  rMsg[256];         // message (trace, wrn, err)
        int    rStoredWidth,      // stored image width
               rStoredHeight,     // stored image height
               rEnhPercent,       // processed data in %
               rModeNumber;       // img process mode
        short *rImageBuffer;      // image buffer
        void  *rUserCallBackProc, // user supplied "ACallBackProc"
              *rUserParam;        // user supplied "AUserParam"
        int    rAborted;          // 1: set by VDIP_Abort; -1:internally
      } tVDIP_CallBackRec;
      // callback procedure  
      typedef void (_stdcall *tVDIP_CallBackProc)( tVDIP_CallBackRec* );
     
      #ifdef INTERNAL_VATECH_DAVINCI_LIBRARY // procedures' declarations ('as is' in the DLL)
     
        // general UI and logs //
        // invokes general property sheet
        BOOL _stdcall VD_Dialog();
        // open log-file
        void _stdcall VD_LogOpen( const TCHAR *AHomeDir, int ANumLogFiles, const TCHAR *AFPrefix );
        // record string to log-file
        void _stdcall VD_LogMsg( const TCHAR *AMsg );
        // close log-file
        void _stdcall VD_LogClose();
        // flush log-file
        void _stdcall VD_LogFlush();
        // returns home directory
        void _stdcall VD_GetHomeDirectory( TCHAR *ADir );
        // set section name in library's initialization profile file
        void _stdcall VD_IniProfSetSection( const TCHAR *ASectName );
        // get string key from library's initialization profile
        const TCHAR* _stdcall VD_IniProfGetStr( const TCHAR *AKeyName, const TCHAR *ADefault );
        ////// acquisition //////
        // sets full frame dimension (should not be called for real acquisitin case)
        void _stdcall VDACQ_SetFrameDim( int AWidth, int AHeight );
        // returns full frame dimension
        void _stdcall VDACQ_GetFrameDim( int *AWidth, int *AHeight );
        // connects to detector
        tVDACQ_CallBackRec* _stdcall VDACQ_Connect( int AFlags,
          tVDACQ_CallBackProc AUserCallBackProc, void *AUserParam, short *AFrameBuffer, int AMode );
        // send simple auxiliary command (FFT only)
        BOOL _stdcall VDACQ_SendCommand( tVDACQ_CallBackRec *ACallBackRec, DWORD ACommand );
        BOOL _stdcall VDACQ_SendCommandParam( tVDACQ_CallBackRec *ACallBackRec, DWORD ACommand, const void *AData, int ADataSize );
        // vendor comamnd (USB only)
        BOOL _stdcall VDACQ_VendorCommand( tVDACQ_CallBackRec *ACallBackRec, int ARequest, int AValue, int AIndex );
        // starts acquisition
        BOOL _stdcall VDACQ_StartFrame( tVDACQ_CallBackRec *ACallBackRec );
    	BOOL _stdcall VDACQ_GetFrame( tVDACQ_CallBackRec *ACallBackRec, int FrameNum );
    	BOOL _stdcall VDDBG_SendCommand( int command, int address, int data1, int data2 );
        // aborts acquisition
        BOOL _stdcall VDACQ_Abort( tVDACQ_CallBackRec *ACallBackRec );
        // releases resources associated with ACallBackRec
        void _stdcall VDACQ_Close( tVDACQ_CallBackRec *ACallBackRec );
        // returns current detector's IP
        void _stdcall VDACQ_GetDetectorIPAddr( TCHAR *AIPAddr );
        // sets detector's IP
        void _stdcall VDACQ_SetDetectorIPAddr( const TCHAR *AIPAddr );
        BOOL _stdcall VDACQ_GetDetectorInfo( int Parameter );
     
        ////// calibration //////
        // returns image dimension; returns FALSE if all cut margins are zero
        BOOL _stdcall VDC_GetImageDim( int *AWidth, int *AHeight );
        // cuts (also rotates and flips optionally) frame buffer to image's dimension.
        short *_stdcall VDC_CutImage( const short *AFrameBuffer, short *AImageBuffer );
        // starts calibration
        tVDC_CallBackRec* _stdcall VDC_Process( int AFlags,
          tVDC_CallBackProc AUserCallBackProc, void *AUserParam, short *AFrameBuffer );
        // aborts calibration
        BOOL _stdcall VDC_Abort( tVDC_CallBackRec *ACallBackRec );
        // releases resources associated with ACallBackRec
        void _stdcall VDC_Close( tVDC_CallBackRec *ACallBackRec );
        // service: returns current calibration directory
        void _stdcall VDC_GetCalibrationDirectory( TCHAR *ADir );
        // service: set temporary calibration directory
        BOOL _stdcall VDC_SetCalibrationDirectory( const TCHAR *ADir );
        // service: returns image cut params
        void _stdcall VDC_GetImgCutParams( tVDC_ImgCut *ACutParams );
        // service: sets image cut params
        void _stdcall VDC_SetImgCutParams( const tVDC_ImgCut *ACutParams );
     
    	//BOOL _stdcall VDC_GenerateAuto( const tBP_ADetRec *ABPR, const TCHAR *AFMaskDark, const TCHAR *AFMaskBright, const TCHAR *ABPMFName );
        BOOL _stdcall VDC_GenerateAuto();
    	int _stdcall VDC_GetDark( tVDACQ_CallBackProc AUserACQCallBackProc, tVDC_CallBackProc AUserCALCallBackProc );
    	int _stdcall VDC_GetBright( tVDACQ_CallBackProc AUserACQCallBackProc, tVDC_CallBackProc AUserCALCallBackProc );
    	BOOL _stdcall VDC_GenerateBright();
     
        ///// image process /////
        // starts img process 
        tVDIP_CallBackRec* _stdcall VDIP_Process( int AFlags,
          tVDIP_CallBackProc AUserCallBackProc, void *AUserParam, short *AImageBuffer, int AModeNumber );
        // aborts img process 
        BOOL _stdcall VDIP_Abort( tVDIP_CallBackRec *ACallBackRec );
        // releases resources associated with ACallBackRec
        void _stdcall VDIP_Close( tVDIP_CallBackRec *ACallBackRec );
     
        //// user interface /////
        void _stdcall VD_Set_Acquisition( int AFlags, short *AFrameData, int AModeNumber, tVDACQ_CallBackProc AUserCallBackProc, void *AUserParam );
        void _stdcall VD_Set_Calibration( int AFlags, short *AFrameData, short *AImgData, tVDC_CallBackProc AUserCallBackProc, void *AUserParam );
    	void _stdcall VD_Get_Calibration( int &AOfsCal, int &AGainCal, int &ABadPixMap, int &m_nCal_HWOfsCal );
        void _stdcall VD_Set_ImgProcess( int AFlags, short *AImgData, int AModeNumber, tVDIP_CallBackProc AUserCallBackProc, void *AUserParam );
        int _stdcall VD_GetImage( HWND AOwner );
        int _stdcall VD_GetImageSP( HWND AOwner, int AWndLeft, int AWndTop, int AWndWidth, int AWndHeight );
        void _stdcall VD_GetImageCancel();
     
    	//// Auxiliary
    	BOOL _stdcall VD_ConnectRestore();
     
      #else // for use in applications
     
        // table of exported methods
        typedef struct {
          HINSTANCE rHDLL; // the library's handle
          // general UI and logs //
          BOOL (_stdcall *rVD_Dialog)( HWND ); // it has additional parameter: owner's window
          void (_stdcall *rVD_LogOpen)( const TCHAR*, int, const TCHAR* );
          void (_stdcall *rVD_LogMsg)( const TCHAR* );
          void (_stdcall *rVD_LogClose)(void);
          void (_stdcall *rVD_LogFlush)(void);
          void (_stdcall *rVD_GetHomeDirectory)( TCHAR* );
          void (_stdcall *rVD_IniProfSetSection)( const TCHAR* );
          const TCHAR* (_stdcall *rVD_IniProfGetStr)( const TCHAR*, const TCHAR* );
          ////// acquisition //////
          void (_stdcall *rVDACQ_SetFrameDim)( int, int );
          void (_stdcall *rVDACQ_GetFrameDim)( int*, int* );
          tVDACQ_CallBackRec* (_stdcall *rVDACQ_Connect)( int, tVDACQ_CallBackProc, void*, short*, int );
          BOOL (_stdcall *rVDACQ_SendCommand)( tVDACQ_CallBackRec*, DWORD );
          BOOL (_stdcall *rVDACQ_SendCommandParam)( tVDACQ_CallBackRec*, DWORD, const void*, int );
          BOOL (_stdcall *rVDACQ_StartFrame)( tVDACQ_CallBackRec* );
    	  BOOL (_stdcall *rVDACQ_GetFrame)( tVDACQ_CallBackRec*, int ); 	  //// 1417P Debug Mode ////
          BOOL (_stdcall *rVDACQ_VendorCommand)( tVDACQ_CallBackRec*, int, int, int );
    	  BOOL (_stdcall *rVDDBG_SendCommand)( int , int , int , int );
          BOOL (_stdcall *rVDACQ_Abort)( tVDACQ_CallBackRec* );
          void (_stdcall *rVDACQ_Close)( tVDACQ_CallBackRec* );
          void (_stdcall *rVDACQ_GetDetectorIPAddr)( TCHAR* );
          void (_stdcall *rVDACQ_SetDetectorIPAddr)( const TCHAR* );
          BOOL (_stdcall *rVDACQ_GetDetectorInfo)( int );
          ////// calibration //////
          BOOL (_stdcall *rVDC_GetImageDim)( int*, int* );
          short* (_stdcall *rVDC_CutImage)( const short*, short* );
          tVDC_CallBackRec* (_stdcall *rVDC_Process)( int, tVDC_CallBackProc, void*, short* );
          BOOL (_stdcall *rVDC_Abort)( tVDC_CallBackRec* );
          void (_stdcall *rVDC_Close)( tVDC_CallBackRec* );
          void (_stdcall *rVDC_GetCalibrationDirectory)( TCHAR* );
          BOOL (_stdcall *rVDC_SetCalibrationDirectory)( const TCHAR* );
          void (_stdcall *rVDC_GetImgCutParams)( tVDC_ImgCut* );
          void (_stdcall *rVDC_SetImgCutParams)( const tVDC_ImgCut* );
    	  BOOL (_stdcall *rVDC_GenerateAuto)( );
    	  int (_stdcall *rVDC_GetDark)( tVDACQ_CallBackProc, tVDC_CallBackProc );
    	  int (_stdcall *rVDC_GetBright)( tVDACQ_CallBackProc, tVDC_CallBackProc );
    	  BOOL (_stdcall *rVDC_GenerateBright)( );
          ///// image process /////
          tVDIP_CallBackRec* (_stdcall *rVDIP_Process)( int, tVDIP_CallBackProc, void*, short*, int );
          BOOL (_stdcall *rVDIP_Abort)( tVDIP_CallBackRec* );
          void (_stdcall *rVDIP_Close)( tVDIP_CallBackRec* );
          //// user interface /////
          void (_stdcall *rVD_Set_Acquisition)( int, short*, int, tVDACQ_CallBackProc, void* );
          void (_stdcall *rVD_Set_Calibration)( int, short*, short*, tVDC_CallBackProc, void* );
    	  void (_stdcall *rVD_Get_Calibration)( int &, int &, int &, int & );
          void (_stdcall *rVD_Set_ImgProcess)( int, short*, int, tVDIP_CallBackProc, void* );
          int (_stdcall *rVD_GetImage)( HWND );
          int (_stdcall *rVD_GetImageSP)( HWND, int, int, int, int );
          void (_stdcall *rVD_GetImageCancel)(void);
    	  //// Auxiliary
    	  BOOL (_stdcall *rVD_ConnectRestore)(void);
        } tVADAV_InterfaceRec; 
     
        BOOL VADAV_MapDLL( const TCHAR *ADllFName, tVADAV_InterfaceRec *AIntfRec );
        // calls LoadLibrary and fills "AIntfRec"
        void VADAV_ReleaseDLL( tVADAV_InterfaceRec *AIntfRec );
        // calls FreeLibrary
     
      #endif // for use in applications
    #endif // ifdef VADAVINTF_H_INCLUDED
    Sinon les approches proposées par bacelar me semblent intéressantes mais pas une mince affaire à mettre en oeuvre. La solution de Médinoc est aussi intéressante et peut-être plus facile à mettre en oeuvre mais je vais devoir étudier de plus près la réalisation de dll car je n'en ai jamais fais.

    J'espère vous avoir apporté des précisions utiles qui pourront vous aider à préciser vos suggestions et je vous remercie d'avance de votre intérêt.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    J'ai une petite lueur d'espoir.

    La technique du mapping des fonctions avec du LoadLybrary et le remplissage de pointeur de fonction, normalement, c'est pour de la programmation bas niveau, donc sans MFC.
    Et la seul structure "utilisant" les MFC ne semble jamais passer en paramètre des fonctions de la Dll.
    Il y a donc des chances que les MFC ne soient utilisées que dans le fichier VADAVIntf.cpp.

    Si c'est le cas, vous n'avez qu'a convertir "VADAVIntf.h/cpp" de MFC vers Qt.
    Pour "VADAVIntf.h", il suffirait de remplacer "#include <afxwin.h>" par l'include Qt correspondant à la fenêtre Qt et de changer la structure "tCallBackRec" pour remplacer le CWnd* par un pointeur sur une fenêtre Qt.

    Avec un peu de chance, les modifications dans "VADAVIntf.cpp" peuvent être assez simple.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Par défaut
    Merci pour votre aide et vos suggestions je vais devoir étudier vos proposition et faire des tests mais je ne pourrais pas vous faire un retour rapidement car j'ai des impératifs rédactionnel et encore quelques examen à préparer.

    Je pense commencer par tester la solution de Médinoc, une dll encapsulant une dll, avant de me lancer dans la modification des fichiers fournis par le fabricant.

    Je vous remercie de votre intérêt et pour vos solutions qui me seront d'un grand secours (même si je pense avoir encore pas mal de chemin pour réussir la mise en œuvre )

    A bientôt.

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Je pense qu'il faudrait mieux commencer par ma suggestion.
    Si ça marche, c'est un quick-win, sinon on est vite prévenu que ça ne marchera pas.
    Avec la solution de Médinoc, il y a beaucoup plus de chance que ça marche mais cela demande un travail initial non négligeable.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/01/2011, 12h11
  2. intégrer google maps dans son projet
    Par miya dans le forum Flex
    Réponses: 11
    Dernier message: 17/04/2009, 19h04
  3. Intégrer le framework dans un projet
    Par costaupo dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 16/03/2007, 10h57
  4. Intégrer crystal report dans un projet jbuilder compilé
    Par stroumfs dans le forum JBuilder
    Réponses: 1
    Dernier message: 02/03/2007, 21h55
  5. [MFC] Utiliser la MFC dans un projet ATL
    Par glKabuto dans le forum MFC
    Réponses: 6
    Dernier message: 24/04/2006, 15h17

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