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

C++/CLI Discussion :

WriteEventLogEntry - Conversion String ^ en PWSTR


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut WriteEventLogEntry - Conversion String ^ en PWSTR
    Bonjour,

    Je souhaite loger des actions dans le journal de Windows avec WriteEventLogEntry.
    Comment convertir mon message qui est une variable de type String ^ en PWSTR ?

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String ^ myMessage;
    myMessage = "ERREUR ETAPE 1";
    WriteEventLogEntry(myMessage, EVENTLOG_INFORMATION_TYPE);
    Erreur 6 error C2664: impossible de convertir le paramètre 1 de 'System::String ^' en 'PWSTR'

  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 519
    Points
    41 519
    Par défaut
    PtrToStringChars() devrait te donner un pin_ptr<wchar_t> implicitement convertible en LPCWSTR, quelle que soit ta version de Visual Studio.
    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 du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Merci !

    Mais j'ai toujours le soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String ^ message = "test" ;
    WriteEventLogEntry(PtrToStringChars(message), EVENTLOG_INFORMATION_TYPE);
    me donne toujours impossible de convertir le paramètre 1 de 'cli::interior_ptr<Type>' en 'PWSTR'

  4. #4
    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
    Ah, je m'étais donc trompé, il donne un interior_ptr<>, il faut donc explicitement passer par un pin_ptr<>.

    Essaie ceci:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String ^ message = "test" ;
    { //pour de bonnes perfs, un pin_ptr doit avoir une durée de vie la plus courte possible
    	pin_ptr<wchar_t> pinW(( PtrToStringChars(message) ));
    	WriteEventLogEntry(pinW, EVENTLOG_INFORMATION_TYPE);
    }
    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.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Merci, mais toujours le message : Erreur 6 error C2440: 'initialisation'*: impossible de convertir de 'cli::interior_ptr<Type>' en 'cli::pin_ptr<Type>'

  6. #6
    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
    Alors cette fois-ci, je fais vraiment de la recherche plutôt que bosser de mémoire, parce que de mémoire, c'était censé marcher.

    Et en regardant dans du code à moi, je tombe sur ceci:
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    	pin_ptr< const wchar_t > pinNameW = PtrToStringChars(name);
    Ce qui veut donc dire que ça ne marche qu'en const.

    Essaie de corriger le code de WriteEventLogEntry() pour accepter un pointeur const (LPCWSTR), car je suis 100% certain que cette fonction n'est pas censée modifier la chaîne reçue en paramètre.
    ...Ou au pire, utilise un const_cast<> :aie:
    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 du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Merci pour ton aide.
    Aurais-tu un autre moyen d'écrire une variable de type String ^ à partir d'un service dans le journal deWindows ?

  8. #8
    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
    L'autre moyen, c'est le Marshal::StringToHGlobalUni() puis Marshal::FreeHGlobal(),
    et à partir de .net 4.0, l'autre autre moyen, c'est marshal_as<wchar_t *>, qui nécessite les bons headers.
    Ces deux méthodes font une copie de la string au lieu de lire directement les caractères qui s'y trouvent.

    Par curiosité, peux-tu poster le code source de WriteEventLogEntry()? Car apparemment ce n'est pas une fonction standard de 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.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 84
    Points : 53
    Points
    53
    Par défaut
    Voici la fonction :

    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
     
    //
    //   FUNCTION: CServiceBase::WriteEventLogEntry(PWSTR, WORD)
    //
    //   PURPOSE: Log a message to the Application event log.
    //
    //   PARAMETERS:
    //   * pszMessage - string message to be logged.
    //   * wType - the type of event to be logged. The parameter can be one of 
    //     the following values.
    //
    //     EVENTLOG_SUCCESS
    //     EVENTLOG_AUDIT_FAILURE
    //     EVENTLOG_AUDIT_SUCCESS
    //     EVENTLOG_ERROR_TYPE
    //     EVENTLOG_INFORMATION_TYPE
    //     EVENTLOG_WARNING_TYPE
    //
    void CServiceBase::WriteEventLogEntry(PWSTR pszMessage, WORD wType)
    {
        HANDLE hEventSource = NULL;
        LPCWSTR lpszStrings[2] = { NULL, NULL };
     
        hEventSource = RegisterEventSource(NULL, m_name);
        if (hEventSource)
        {
            lpszStrings[0] = m_name;
            lpszStrings[1] = pszMessage;
     
            ReportEvent(hEventSource,  // Event log handle
                wType,                 // Event type
                0,                     // Event category
                0,                     // Event identifier
                NULL,                  // No security identifier
                2,                     // Size of lpszStrings array
                0,                     // No binary data
                lpszStrings,           // Array of strings
                NULL                   // No binary data
                );
     
            DeregisterEventSource(hEventSource);
        }
    }

    Pour écrirer dans les logs de Windows, je suis en train d'essayer avec la class EventLog.
    Mais là aussi j'ai quelques soucis car je n'arrive pas à créer un journal...

  10. #10
    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
    Si j'en crois ça, il n'y a donc AUCUNE raison d'avoir pszMessage en PWSTR au lieu de LPCWSTR.
    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.

Discussions similaires

  1. conversion string--> blob
    Par zimzoum10 dans le forum Débuter
    Réponses: 13
    Dernier message: 23/02/2005, 16h41
  2. [Conversion] String en InputStream
    Par canou94 dans le forum Langage
    Réponses: 5
    Dernier message: 22/02/2005, 15h04
  3. [CONVERSION] String -> HEXADECIMAL ...
    Par tripop dans le forum Langage
    Réponses: 9
    Dernier message: 13/01/2005, 09h42
  4. conversion String en Date (parse trop permissif)
    Par ciloulou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 13/09/2004, 18h36
  5. [FLASH MX 2004] conversion string en int.
    Par calfater dans le forum Flash
    Réponses: 3
    Dernier message: 26/05/2004, 15h00

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