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

wxWidgets Discussion :

Migration de la 2.6.3 sous VC9 à la 2.8.10 sous VC9


Sujet :

wxWidgets

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut Migration de la 2.6.3 sous VC9 à la 2.8.10 sous VC9
    bonjour,

    a partir d'un exemple DllCaller.exe & wxDll.dll sous VC6 et wx2.6.3, j'essaye de passer à la version sous VC9 et wx2.8.10

    la conversion de VC6 vers VC9 se passe bien et je recree mon projet correctement avec la version 2.6.3 de wxWidgets

    mais lorsque j'adapte les chemins et les lib de la version 2.6.3 vers la version 2.8.10 de wxWidgets, je me retrouve avec des erreurs de compilation de wxDll.cpp

    j'ai des erreurs sur des fichiers 'include' dont voici un extrait
    c:\microsoft\wxwidgets-2.8.10\include\wx\msw\winundef.h(39) : error C2664: 'CreateDialogParamW'*: impossible de convertir le paramètre 2 de 'LPCTSTR' en 'LPCWSTR'
    Les types pointés n'ont aucun rapport entre eux*; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
    il me semble que j'ai une erreur qui ressemblerait a un problème sur les 'lib' dont voici la liste chronologique
    wxmsw28d_core.lib
    wxbase28d.lib
    wxbase28d_net.lib
    wxbase28d_odbc.lib
    wxexpatd.lib
    wxjpegd.lib
    wxmsw28d_adv.lib
    wxmsw28d_dbgrid.lib
    wxmsw28_gl.lib
    wxmsw28d_html.lib
    wxmsw28d_xrc.lib
    wxbase28d_xml.lib
    wxpngd.lib
    wxregexd.lib
    wxtiffd.lib
    wxzlibd.lib
    winmm.lib
    comctl32.lib
    rpcrt4.lib
    wsock32.lib
    odbc32.lib
    odbccp32.lib
    et voici la ligne de commande du projet pour les pros
    /OUT:".\Debug/wxDll.dll" /INCREMENTAL /NOLOGO /LIBPATH:"c:\microsoft\wxWidgets-2.8.10\lib\vc_lib" /DLL /MANIFEST /MANIFESTFILE:".\Debug\wxDll.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:".\Debug/wxDll.pdb" /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /IMPLIB:".\Debug/wxDll.lib" /MACHINE:X86 /ERRORREPORTROMPT wxmsw28d_core.lib wxbase28d.lib wxbase28d_net.lib wxbase28d_odbc.lib wxexpatd.lib wxjpegd.lib wxmsw28d_adv.lib wxmsw28d_dbgrid.lib wxmsw28_gl.lib wxmsw28d_html.lib wxmsw28d_xrc.lib wxbase28d_xml.lib wxpngd.lib wxregexd.lib wxtiffd.lib wxzlibd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

    Auriez vous déjà été confronté à cette difficulté ?
    Trouver la solution me semble assez hasardeux si il s'agit d'un ordre dans la liste de bibliothèques

    Merci de votre lecture et de vos bonnes idées

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Il y a vraisemblablement une différence unicode/non unicode entre ton programme et la version de wxWidgets utilisée. Tu devrais compiler wxWidgets en unicode (librairie postfixée par 'u') et l'utiliser ainsi dans ton programme compilé lui aussi en unicode. Cf wxWidgets : Téléchargement et compilation sous Windows.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    dans mon repertoire
    c:\wxWidgets-2.8.10
    j'ai bien compilé à partir de
    C:\wxWidgets-2.8.10\build\msw\wx.dsw
    toutes les solutions possibles msw & mswd, mswu & mswud, mswuniv & mswunivd, mswunivu & mswunivud

    ainsi que les exemples qui fonctionnent à priori tous pour en avoir essayés plusieurs

    lorsque je change de configuration, j'ai toujours la même erreur, 'release' ou 'debug', 'unicode' ou pas 'unicode' ...

    voici la ligne de commande de compilation avec une configuration 'release' et non 'unicode'
    /O2 /Ob1 /I "c:\microsoft\wxWidgets-2.8.10\lib\vc_lib\msw" /I "c:\microsoft\wxWidgets-2.8.10\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "__WXMSW__" /D "__WXDEBUG__" /D "DLLFUNCTIONS_EXPORTS=1" /D "_VC80_UPGRADE=0x0600" /D "_WINDLL" /GF /FD /EHsc /MTd /Gy /Fp".\Release/wxDll.pch" /Fo".\Release/" /Fd".\Release/" /W3 /nologo /c /TP /errorReport:prompt
    et la ligne de commande d'edition des liens correspondante
    /OUT:".\Release/wxDll.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"c:\microsoft\wxWidgets-2.8.10\lib\vc_lib" /DLL /MANIFEST /MANIFESTFILE:".\Release\wxDll.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:".\Release/wxDll.pdb" /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /IMPLIB:".\Release/wxDll.lib" /MACHINE:X86 /ERRORREPORT:PROMPT wxmsw28_core.lib wxbase28.lib wxbase28_net.lib wxbase28_odbc.lib wxexpat.lib wxjpeg.lib wxmsw28_adv.lib wxmsw28_dbgrid.lib wxmsw28_gl.lib wxmsw28_html.lib wxmsw28_xrc.lib wxbase28_xml.lib wxpng.lib wxregex.lib wxtiff.lib wxzlib.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
    et les erreurs sont toujours du meme type :
    c:\microsoft\wxwidgets-2.8.10\include\wx\msw\winundef.h(39) : error C2664: 'CreateDialogParamW'*: impossible de convertir le paramètre 2 de 'LPCTSTR' en 'LPCWSTR'
    Les types pointés n'ont aucun rapport entre eux*; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
    comme si il pouvait y avoir une confusion des fichiers d'entete .h ou je ne sais pas quoi d'autre ...

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Est-ce que dans "c:\microsoft\wxWidgets-2.8.10\lib\vc_lib\msw\setup.h", wxUSE_UNICODE vaut bien 0 ?
    Est-ce que tu n'aurais pas un #define _UNICODE ou #define UNICODE dans un autre en-tête ?
    Tu peux faire le test suivant avant de compiler ton projet : dans le fichier wxWidgets-2.8.10\include\wx\platform.h, ajoutes une ligne invalide à la ligne 235 environ :
    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
    /* set wxUSE_UNICODE to 1 if UNICODE or _UNICODE is defined */
    #if defined(_UNICODE) || defined(UNICODE)
    je veux une erreur !
    #   undef wxUSE_UNICODE
    #   define wxUSE_UNICODE 1
    #else /* !UNICODE */
    #   ifndef wxUSE_UNICODE
    #       define wxUSE_UNICODE 0
    #   endif
    #endif /* UNICODE/!UNICODE */
    
    /* and vice versa: define UNICODE and _UNICODE if wxUSE_UNICODE is 1 */
    #if wxUSE_UNICODE
    je veux une erreur !
    #   ifndef _UNICODE
    #       define _UNICODE
    #   endif
    #   ifndef UNICODE
    #       define UNICODE
    #   endif
    #endif /* wxUSE_UNICODE */
    Si la compilation de ton projet sort une erreur c'est que tu as une incohérence dans les directives.

    Les lignes de compilation que tu montres ont l'air cohérente avec une version release unicode (à part /D "__WXDEBUG__" mais ça ne concerne pas l'unicode. Pourquoi une version debug dans une version release ?). Donc je pense plutôt à un mauvais setup.h ou à une définition de _UNICODE autre part.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Est-ce que dans "c:\microsoft\wxWidgets-2.8.10\lib\vc_lib\msw\setup.h", wxUSE_UNICODE vaut bien 0 ?
    c'est exactement cela !

    en suivant le tutoriel d'installation , j'ai modifié cette valeur à 1 comme suggéré pour la compilation des bibliothèques
    et je ne comprennais pas pourquoi l'option generale 'unicode' de VC9 devenait compatible avec des include 'vc_lib\msw' non unicode ...

    mais pourquoi suggérer dans votre tutoriel la création de bibliothèques unicode (wxUSE_UNICODE 1) avec des noms de fichiers à priori non unicode (wxmsw28_core.lib au lieu de wxmsw28u_core.lib) ?

    Je finis le travail et propose une archive d'un projet VC9 & wxWid2.8.10

    Merci

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par carreau Voir le message
    mais pourquoi suggérer dans votre tutoriel la création de bibliothèques unicode (wxUSE_UNICODE 1) avec des noms de fichiers à priori non unicode (wxmsw28_core.lib au lieu de wxmsw28u_core.lib) ?
    Une boulette Mais je ne retrouve pas où je propose des noms de fichiers non unicode ? Peux-tu me dire où je me suis planté que je corrige

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    ici meme
    Modifier le setup : "\wxWidgets-2.8.10\include\wx\msw\setup.h" :
    #define wxUSE_UNICODE 1
    mille excuses, c'est moi qui me suit trompé car je n'ai toujours pas très bien compris la différence avec '\wxWidgets-2.8.10\lib\vc_lib\msw\wx\setup.h'
    et pourquoi ces deux répertoires '\wxWidgets-2.8.10\lib\vc_lib\msw' et '\wxWidgets-2.8.10\include' sont mentionnés dans la meme boite de propriétés

    je cherche maintenant à savoir si les propriétés VC9 'unicode oui' sont incompatibles avec 'wxUSE_UNICODE 0' du 'vc_lib\msw\wx\setup.h'
    car je pencherai pour l'idée que ASCII est complètement compris dans UNICODE

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par carreau Voir le message
    mille excuses, c'est moi qui me suit trompé car je n'ai toujours pas très bien compris la différence avec '\wxWidgets-2.8.10\lib\vc_lib\msw\wx\setup.h'
    et pourquoi ces deux répertoires '\wxWidgets-2.8.10\lib\vc_lib\msw' et '\wxWidgets-2.8.10\include' sont mentionnés dans la meme boite de propriétés
    En fait, les 2 répertoires ont un objectif différent :
    -> \wxWidgets-2.8.10\include (1) : ce répertoire contient toutes les définitions pour wxWidgets indépendamment de la version générée.
    -> \wxWidgets-2.8.10\lib\vc_lib\msw (2) : ce répertoire contient essentiellement des directives de compilations dépendantes de la version générée.
    Il faut inclure ces deux répertoires et en respectant l'ordre pour avoir accès aux interfaces wxWidget (1) mais avec la même configuration (2) que celle utilisée pour générer les .lib avec lesquels l'application sera liée. Idéalement, pour éviter les conflits, tu pourrais supprimer setup.h de \wxWidgets-2.8.10\include et pour windows rcdef.h de \wxWidgets-2.8.10\include\msw.
    Citation Envoyé par carreau Voir le message
    je cherche maintenant à savoir si les propriétés VC9 'unicode oui' sont incompatibles avec 'wxUSE_UNICODE 0' du 'vc_lib\msw\wx\setup.h'
    car je pencherai pour l'idée que ASCII est complètement compris dans UNICODE
    Le problème n'est pas qu'ASCII soit contenu dans UNICODE mais plutôt le type utilisé pour les caractères dans l'un et l'autre mode. En ascii, les chaînes de caractères et tous ce qui en découle sont construits sur des char. En UNICODE, ce sont des wchar_t. Ce sont deux types différents. Derrière, pour faciliter l'écriture, Windows définit 3 types :

    De la même façon, les chaînes de caractères sont définies ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // unicode : 
    typedef WCHAR *LPWSTR;
    typedef CONST WCHAR *LPCWSTR;
    // ascii :
    typedef CHAR *LPSTR;
    typedef CONST CHAR *LPCSTR;
    // selon la directive de compilation UNICODE ou non :
    typedef TCHAR *LPTSTR;
    typedef const TCHAR *LPCTSTR;
    Ensuite, l'API Windows présente 2 versions de chacune des fonctions dépendantes de ces types : les versions ASCII, en général terminée par A, et les versions UNICODE, en générale terminée par W.
    Si on reprend ton exemple, Windows a 2 fonctions CreateDialogParam:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WINUSERAPI HWND WINAPI CreateDialogParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM);
    WINUSERAPI HWND WINAPI CreateDialogParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM);
    et un define en fonction d'UNICODE ou non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef UNICODE
    #define CreateDialogParam CreateDialogParamW
    #else
    #define CreateDialogParam CreateDialogParamA
    #endif
    On comprend bien alors que si on appelle CreateDialogParamW (resp. CreateDialogParamA) avec un LPCSTR (resp LPCWSTR), alors cela ne compile plus car la conversion LPCSTR<->LPCWSTR n'est heureusement pas implicite. Normalement tout est fait grâce aux directives (_)UNICODE pour que cela se passe bien. Maintenant, si tu as une incohérence entre les directives de compilation (car mal positionnée dans setup.h et/ou problème de répertoire d'inclusion) tu te retrouves avec le problème que tu as rencontré : essayer d'utiliser une version UNICODE avec des chaînes de caractères ASCII (ou inversement). Et ça coince

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    c'est alors aussi pour cette raison que je devais transformer les chaines de caracteres constantes "blabla" avec wxT("blabla"), ce qui n'est pas utile lorsqu'il n'y a plus de conflit de configuration

    merci encore pour ce cours très clair

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par carreau Voir le message
    c'est alors aussi pour cette raison que je devais transformer les chaines de caracteres constantes "blabla" avec wxT("blabla"), ce qui n'est pas utile lorsqu'il n'y a plus de conflit de configuration
    Normalement, il est recommandé de toujours utiliser des wxT("blabla") car :
    "blabla" est de type char[] (défini par la norme C++)
    L"blabla" est de type wchar_t[] (défini par la norme C++)

    wxT est juste une macro wxWidgets permettant de choisir le bon type toujours selon la directive de compilation wxUSE_UNICODE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        #if !wxUSE_UNICODE
            #define wxT(x) x
        #else /* Unicode */
            #define wxT(x) L ## x
        #endif /* ASCII/Unicode */
    Citation Envoyé par carreau Voir le message
    merci encore pour ce cours très clair
    You 'r very velcom'

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut suite et fin (finale)
    une fois les bibliothèques de wxWidgets correctement construites,
    est il envisageable de suprimer les fichiers qui ont servi à leur construction pour ne garder que les *.LIB et les *.DLL
    et supprimer notamment les *.OBJ des répertoires 'C:\wxWidgets-2.8.10\build\msw\vc_msw\adv' et suivants ?
    ainsi que supprimer les *.PDB, *.IDB *.EXP ?
    afin de faire de la place
    Merci pour votre aide

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Oui. Tu peux supprimer tous les objets temporaires de la construction (.obj, .sbr, etc.). Seuls sont nécessaires les .lib et les .dll (si librairie dynamique).

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/02/2011, 19h12
  2. Une fonction sous Excel 2007 ne fonctionne pas sous Excel 2003
    Par Dryss51 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 27/07/2007, 08h09
  3. Réponses: 8
    Dernier message: 11/07/2007, 09h38
  4. le sous-adressage des machines d'un sous-réseau
    Par witch dans le forum Hardware
    Réponses: 3
    Dernier message: 17/06/2007, 22h10
  5. Réponses: 11
    Dernier message: 22/04/2007, 10h58

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