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 :

Copier et découper un WCHAR


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Par défaut Copier et découper un WCHAR
    Bonjour à tous,

    C'est sûrement une erreur de débutant, mais je coince sur un truc: j'essaie de copier un WCHAR dans une autre avec wcscpy et de le découper avec substr. C'est pour la méthode IsVolumeSupported (VSS SDK) qui revoie un BOOL pour savoir si un volume supporte les shadow copy ou pas. ça donne à peu près ça:
    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
     
    void SaveAfile(WCHAR SourceFile[], WCHAR DestFile[])
    {
           .......
            VSS_PWSZ pSourceVolumeName;
    	WCHAR tempstr;
    	wcscpy(tempstr, SourceFile);
    	pSourceVolumeName = tempstr.substr(1, 3);
           pBackupComponent->IsVolumeSupported(
                                  GUID_NULL, 
                                  pSourceVolumeName, 
                                  &pIsShadowCopySupported
                                                                   );
           .......
    }
    et je me retrouve avec deux erreurs:
    error C2664: 'wcscpy'*: impossible de convertir le paramètre 1 de 'WCHAR' en 'wchar_t *'
    et le deuxième:
    error C2228: la partie gauche de '.substr' doit avoir un class/struct/union
    1> le type est 'WCHAR'
    Pour la première, je suis un peu coincé car il semble que VSS_PWSZ soit un WCHAR, et pas un wchar_t, et pour la deuxième, substr ne fonctionne pas sur un WCHAR, mais sur un char.

    Si quelqu'un à une suggestion, merci par avance...

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Tu essayes de copier un tableau de WCHARs dans un seul WCHAR.
    Il faut que tu déclares tempstr en tant que tableau ou pointeur (je préfère le premier ).

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Par défaut
    Bonjour Spout,

    Merci de ta réponse.

    J'ai essayé de remplacer WCHAR tempstr par WCHAR tempstr[]. Le soucis, c'est qu'il me dit que je n'ai pas le droit de ne pas spécifier de taille.

    Alors j'ai fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int WcharLength = (SourceFile->Length);
    WCHAR tempstr[WcharLength];
    wcscpy(tempstr, SourceFile);
    et je me retrouve avec une erreur
    C2227: la partie gauche de '->Length' doit pointer vers un type class/struct/union/générique
    Alors j'ai fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int WcharLength = sizeof(SourceFile);
    WCHAR tempstr[WcharLength];
    wcscpy(tempstr, SourceFile);
    Et là, je recoince

    error C2057: expression constante attendue
    error C2466: impossible d'allouer un tableau de taille constante 0
    error C2133: 'tempstr'*: taille inconnue
    D'après mes recherches, on crée un tableau en lui donnant en argument un entier.

    Y'a pas une astuces pour lui donner une variable? D'avance merci pour toute pistes

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 110
    Par défaut
    Et en plus d'être mauvais, j'ai surement fais n'importe quoi et je ne pose pas les bonnes questions...

    Je reprends. La methode IVssBackupComponents::IsVolumeSupported prends (entre autre) un VSS_PWSZ, et pas un tableau VSS_PWSZ[].

    Donc, est-ce que je dois prendre un WCHAR[], un WCHAR, ou encore autre chose que je ne connais pas? Je reconnais être carrément perdu

    En fait j'ai besoin que ma classe prenne en argument une chaine de caractère du genre c:\mon\chemin\vers\mon\fichier. J'ai pensé à un WCHAR, puisqu'il semble qu'un VSS_PWSZ en soit un:

    http://msdn.microsoft.com/en-us/libr...41(VS.85).aspx

    Je me suis tourné vers un WCHAR[] suite à une erreur de compilation...

    Il me faut les trois premiers caractères du WCHAR (ou autre) pour en faire le VSS_PWSZ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void SaveAfile(WCHAR SourceFile, WCHAR DestFile)
    {
    VSS_PWSZ pSourceVolumeName;
     
    	WCHAR tempstr;
    	wcscpy(tempstr, SourceFile);
    	pSourceVolumeName = tempstr.substr(1, 3);
    	BOOL pIsShadowCopySupported;
    	pBackupComponent->IsVolumeSupported(GUID_NULL, pSourceVolumeName, &pIsShadowCopySupported);
    }
    Et ça me génère les erreurs suivantes:
    error C2664: 'wcscpy'*: impossible de convertir le paramètre 1 de 'WCHAR' en 'wchar_t *'
    La conversion d'un type intégral en type pointeur nécessite reinterpret_cast, un cast de style C ou un cast de style fonction.
    Est-ce que je peux faire autrement pour éviter une convertion, ou bien j'ai pas le choix?

    D'avance merci, et encore désolé de ne pas avoir posé correctement le problème

  5. #5
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Tu ne peux pas déclarer un tableau avec une taille qui n'est pas connue à la compilation (allocation statique de mémoire). Mais tu peux le faire via un malloc() (allocation dynamique de mémoire).
    Je te laisse consulter la doc de cette fonction, n'hésite pas à poser des questions si tu ne comprends pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. trier, découper et copier un fichier txt
    Par triaguae dans le forum VBScript
    Réponses: 2
    Dernier message: 19/01/2009, 11h09
  2. Copier un .com sur le 1er secteur d'une disquette
    Par zdra dans le forum Assembleur
    Réponses: 5
    Dernier message: 23/08/2002, 18h03
  3. Copier le texte d'un ListBox dans le clipboard.
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/08/2002, 08h20
  4. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20
  5. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51

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