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

Visual C++ Discussion :

[VS2010] Options de compilation/link x64-> MessageBox qui ne s'affiche pas


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 31
    Points : 27
    Points
    27
    Par défaut [VS2010] Options de compilation/link x64-> MessageBox qui ne s'affiche pas
    Bonjour à tous,

    Je cherche à comprendre pourquoi mon projet DLL n'affiche pas les MessageBox que j'utilise pour logguer les entrées de fonction (le hint m'indique #define MessageBox MessageBoxA lorsque je passe sur MessageBox ).
    Je précise que c'est une DLL à l'origine 32 bits que je convertis en 64 bits, mais à l'origine c'était compilé sous Visual Studio 6.
    C'est une DLL JNI, qu'on appelle avec une application JAVA.
    Je pense que le problème vient des options de compilation.

    Mes options de compilation:

    Compilateur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Zi /nologo- /W3 /WX- /O1 /D "WIN32" /D "NDEBUG" /D "IAL" /D "_LITTLE_ENDIAN" /D "_AMD64_" /D "amd64" /D "WIN32_LEAN_AND_MEAN" /GF /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp".\Release2\MADLL_VISUAL_STUDIO_6.pch" /Fa".\Release2\" /Fo".\Release2\" /Fd".\Release2\" /Gd /errorReport:prompt
    Linker:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /OUT:"x64/Release2/madll.dll" /INCREMENTAL:NO /DLL ".\EZtwain\eztwain4.lib" ".\lib\ijl15.lib" ".\lib\ijl15l.lib" "user32.lib" /MANIFEST:NO /ManifestFile:"x64\Release 2\madll.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:NO /DEBUG /PDB:"C:\svnsandbox\trunk\jtwain_new_64bit_vs2010\x64\Release 2\madll.pdb" /SUBSYSTEM:WINDOWS /PGD:"C:\svnsandbox\trunk\madll_64bit_vs2010\x64\Release 2\madll.pgd" /DYNAMICBASE:NO /NXCOMPAT:NO /MACHINE:X64 /ERRORREPORT:PROMPT

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    MessageBox pour logger des entrées de fonction, c'est un peu lourd, vous trouvez pas ?
    Un OutputDebugString https://msdn.microsoft.com/fr-fr/lib...=vs.85%29.aspx, c'est bien plus light.

    Il vous dit quoi le débogueur ?

    Utilisez une capsule RAII avec OutputDebugString pour avoir automatiquement les trace d'entré et de sortie d'une fonction.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    MessageBox pour logger des entrées de fonction, c'est un peu lourd, vous trouvez pas ?
    Un OutputDebugString https://msdn.microsoft.com/fr-fr/lib...=vs.85%29.aspx, c'est bien plus light.
    Si, tout à fait, mais c'était déjà dans le code d'origine donc je suis excusé.
    Depuis mon dernier message j'ai voulu mettre quelques logs artisanaux. Par contre, le pemier log s'affiche et la suite ne s'affiche pas, même si je mets deux logs consécutifs. En lisant ensuite votre message, je me suis dit que probablement j'avais besoin de ce que vous appelez la "capsule RAII", dont je maîtrise mal le concept.

    Il vous dit quoi le débogueur ?
    Je ne sais pas l'utiliser dans ce cas là. Je génère ma DLL et je l'intègre ensuite à mon projet dans Tomcat pour que ma JVM 64 bits l'appelle.

    Utilisez une capsule RAII avec OutputDebugString pour avoir automatiquement les trace d'entré et de sortie d'une fonction.
    Je vais chercher un modèle de capsule RAII sur le web pour comprendre ce que je fais.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Je veux m'inspirer de ce code pour le RAII:

    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
    #include <string>
    #include <mutex>
    #include <iostream>
    #include <fstream>
    #include <stdexcept>
     
    void write_to_file (const std::string & message) {
        // mutex to protect file access (shared across threads)
        static std::mutex mutex;
     
        // lock mutex before accessing file
        std::lock_guard<std::mutex> lock(mutex);
     
        // try to open file
        std::ofstream file("example.txt");
        if (!file.is_open())
            throw std::runtime_error("unable to open file");
     
        // write message to file
        file << message << std::endl;
     
        // file will be closed 1st when leaving scope (regardless of exception)
        // mutex will be unlocked 2nd (from lock destructor) when leaving
        // scope (regardless of exception)
    }
    Seulement j'utilise Visual Studio 2010, qui n'a pas la classe mutex dans la librairie standard.
    Donc à ce que je crois comprendre je dois installer la librairie Boost qui le fait...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Je vais suivre le tutoriel de cette page, je télécharge une ancienne version de boost (1.47.0) pour coller à la procédure.
    boost_1_47_0.zip
    How to use Boost in Visual Studio 2010

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Je ne vois pas trop le rapport entre votre problème initial et les mutex.
    Pour faire une capsule RAII, un objet avec un constructeur et un destructeur fait l'affaire.

    Pour votre problème initial, le débuggeur est votre meilleur ami.

    Je ne suis pas un spécialiste de Tomcat, j'y connais même rien, mais il doit quand même charger les Dll comme les autres programmes.

    Donc, la stratégie pour le débugging dans VS, c'est de configurer les paramètres de débugging de votre projet de Dll pour que ça lance le programme qui chargera la Dll.
    Si c'est bien fait, les paramètres nécessaires au programme sont en ligne de commande et en fichier de configuration.
    Les paramètres de débugging du projet permettent d'indiquer les paramètres de l'exécutable et son répertoire de travail.

    En lançant le débogueur depuis votre projet dans VS et avec des breakpoints, il lancera le programme (donc tomcat ici) avec les bonnes options et le débogueur sera prévenu du chargement d'une Dll, et modifiera le code le la Dll à la volé pour que les point d'arrêt deviennent de vrais "int 3" dans le code binaire.

    Quand l'exécutable arrive sur un ses "int 3", le programme s'interrompt, passe la main au débuggeur qui vous affichera votre code avec les valeurs de variables qui va bien.
    Si vous n'arrivez pas à ces points d'arrêt, c'est que le problème n'est vraisemblablement pas dans votre code.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Bon alors merci, je vais me débrouiller autrement, je n'ai rien compris. Merci d'avoir essayé.

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Tu mets un point d'arrêt dans VS.
    Tu configures ton projet de la Dll pour lancer Tomcat lors du démarrage d'une session de debugging.
    Tu lances le débogueur avec F5.
    Le programme s'arrêtera directement sur ton point d'arrêt.

  9. #9
    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 519
    Points
    41 519
    Par défaut
    Le problème là-dedans, c'est que si ça se trouve Tomcat tourne en tant que service.
    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.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Il n'y a pas une option pour le lancer en stand-alone ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/01/2015, 13h55
  2. Option de compilation gcc : sem.h
    Par Luther13 dans le forum Linux
    Réponses: 8
    Dernier message: 29/12/2004, 12h29
  3. [Compilateur]Option de compil
    Par Guybrush dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/09/2004, 11h22
  4. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  5. Réponses: 2
    Dernier message: 27/02/2004, 13h47

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