Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1277 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Copie de CString vers LPSTR...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Copie de CString vers LPSTR...

n°365982
gooopil
pfiew
Posté le 18-04-2003 à 10:07:16  profilanswer
 

Hello
 
Voila le bout de code que j'arrive pas à faire marcher :
 

Code :
  1. TVINSERTSTRUCT tvInsert;
  2. (...)
  3. strcpy(tvInsert.item.pszText , genre);
  4. newItem.hitem =  pCtrl.InsertItem(&tvInsert);


 
Ca crash sur le strcpy :(
genre est une CString valable puisque je peux l'afficher dans une messagebox par exemple....
Si je remplace genre par du texte :

Code :
  1. strcpy(tvInsert.item.pszText , "Truc" );


Ca marche sans aucun problème....
 
Voila, merci d'avance :)
 

mood
Publicité
Posté le 18-04-2003 à 10:07:16  profilanswer
 

n°366053
weblook$
happy face
Posté le 18-04-2003 à 10:44:50  profilanswer
 

t'as une macro pour transformer ta CString en char*.
un truc comme:
   CString genre
   char* str=LPCSTR(genre)

n°366066
gooopil
pfiew
Posté le 18-04-2003 à 10:49:14  profilanswer
 

En fait, je pense que quand je fait strcpy (char *, CString), la CString est automatiquement casté en char *. du coup,  
 
strcpy(tvInsert.item.pszText , LPCSTR(genre));
 
Me fait exactement la même erreur....
 
Good try man :)
 
Au fait, l'erreur c'est une erreur de type memory can't be written...


Message édité par gooopil le 18-04-2003 à 10:50:34
n°366070
theshockwa​ve
I work at a firm named Koslow
Posté le 18-04-2003 à 10:51:00  profilanswer
 

fais voir l'init de genre .....


---------------
last.fm
n°366077
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-04-2003 à 10:54:02  profilanswer
 

si Genre est une CString, alors utilise genre.GetBuffer() pour récupére le buffer contenant la chaine. tu obtiens l'équivalent d'un char *
 
une fois que tu n'en a plus besoin, tu fais un genre.ReleaseBuffer()


---------------
J'ai un string dans l'array (Paris Hilton)
n°366087
gooopil
pfiew
Posté le 18-04-2003 à 10:58:22  profilanswer
 

J'ai fait :
 
strcpy(tvInsert.item.pszText , genre.GetBuffer(genre.GetLength()));
 
genre.ReleaseBuffer();
 
et ca me fait toujours la même chose....
 
Faut-y que je vérifie l'init de genre (j'arrive à l'afficher cette string...) ?

n°366095
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-04-2003 à 11:02:24  profilanswer
 

Gooopil a écrit :

J'ai fait :
 
strcpy(tvInsert.item.pszText , genre.GetBuffer(genre.GetLength()));
 
genre.ReleaseBuffer();
 
et ca me fait toujours la même chose....
 
Faut-y que je vérifie l'init de genre (j'arrive à l'afficher cette string...) ?  


Inutile de mettre des paramètres pour GetBuffer()


---------------
J'ai un string dans l'array (Paris Hilton)
n°366096
El_gringo
Posté le 18-04-2003 à 11:03:04  profilanswer
 

Harkonnen a écrit :

si Genre est une CString, alors utilise genre.GetBuffer() pour récupére le buffer contenant la chaine. tu obtiens l'équivalent d'un char *
 
une fois que tu n'en a plus besoin, tu fais un genre.ReleaseBuffer()


 
Pas besoin : strcpy prend un const char * comme 2e paramètre : une CString est castée implicitement en LPCTSTR (pointeur constant sur chaine ~= const char *)
Et si tu faus un bête:

Code :
  1. char szTest[1024];
  2. msmet (szTest, 0, sizeof (szTest));
  3. strcpy (szTest, genre);


ça marche ?

n°366098
El_gringo
Posté le 18-04-2003 à 11:04:35  profilanswer
 

Harkonnen a écrit :


Inutile de mettre des paramètres pour GetBuffer()


 
Et GetBuffer, ça rend un tableau de quelle taille ?
'faut bien fixer une taille, pour ne pas risquer un débordement tableau (pas la taille de "genre", évidement, mais plutot la taille de la chaine que genre va acueillir)

n°366099
polo021
Posté le 18-04-2003 à 11:04:46  profilanswer
 

Harkonnen a écrit :


Inutile de mettre des paramètres pour GetBuffer()


ha ben la je ne suis pas d'accord
 :heink:

Code :
  1. error C2660: 'GetBuffer' : function does not take 0 parameters


PS : il faut bien noter la presence du S a 0 parameters
 :sol:

mood
Publicité
Posté le 18-04-2003 à 11:04:46  profilanswer
 

n°366109
gooopil
pfiew
Posté le 18-04-2003 à 11:08:50  profilanswer
 

VC++ il connait pas msmet....
Et il faut absolument un param à GetBuffer en effet.  
 
J'a essayé  

Code :
  1. char szTest[1024];
  2. //msmet (szTest, 0, sizeof (szTest));
  3. strcpy (szTest, genre);
  4. strcpy(tvInsert.item.pszText , szTest);


 
Et ben c'est toujours pareil :)
 
Edit :  
Au fait, dans genre j'ai jamais une chaine bien longue, c'est le genre qui est lu dans un tag mp3, la en l'occurence je teste sur un fichier genre=blues du coup ca doit bien rentrer dans szTest[1024]


Message édité par gooopil le 18-04-2003 à 11:11:05
n°366113
theshockwa​ve
I work at a firm named Koslow
Posté le 18-04-2003 à 11:09:35  profilanswer
 

El_gringo a écrit :


Code :
  1. char szTest[1024];
  2. msmet (szTest, 0, sizeof (szTest));
  3. strcpy (szTest, genre);




 
humhum ... sizeof(char[1024]) ou sizeof sztest .... merci ...


---------------
last.fm
n°366120
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-04-2003 à 11:11:31  profilanswer
 

polo021 a écrit :


ha ben la je ne suis pas d'accord
 :heink:

Code :
  1. error C2660: 'GetBuffer' : function does not take 0 parameters


PS : il faut bien noter la presence du S a 0 parameters
 :sol:  


j'ai pas souvenir d'en avoir mis pourtant, j'utilisais les MFC de Visual Studio 5.0, ça a peut etre changé depuis :??:


---------------
J'ai un string dans l'array (Paris Hilton)
n°366121
theshockwa​ve
I work at a firm named Koslow
Posté le 18-04-2003 à 11:11:53  profilanswer
 

Gooopil a écrit :

VC++ il connait pas msmet....
Et il faut absolument un param à GetBuffer en effet.  
 
J'a essayé  

Code :
  1. char szTest[1024];
  2. //msmet (szTest, 0, sizeof (szTest));
  3. strcpy (szTest, genre);
  4. strcpy(tvInsert.item.pszText , szTest);


 
Et ben c'est toujours pareil :)
 
Edit :  
Au fait, dans genre j'ai jamais une chaine bien longue, c'est le genre qui est lu dans un tag mp3, la en l'occurence je teste sur un fichier genre=blues du coup ca doit bien rentrer dans szTest[1024]


 
par contre, quand on se sert d'un clavier avec les doigts, on peut taper memset qui marche tout de suite mieux ... :D
 
 
Ton choix d'utiliser strcpy est assez discutable ... Tu connais strncpy ?
 
 
Edit ... Je suis fatigué, moi ... :D


Message édité par theshockwave le 18-04-2003 à 11:14:41

---------------
last.fm
n°366125
polo021
Posté le 18-04-2003 à 11:13:52  profilanswer
 

Harkonnen a écrit :


j'ai pas souvenir d'en avoir mis pourtant, j'utilisais les MFC de Visual Studio 5.0, ça a peut etre changé depuis :??:


ben ca doit etre ca. Alors j'ai contourne le probleme (je ne savais pas combien mettre comme parametre)
i=0;
while (i<string.getlenght())
{
char[i]= string.getat(i;)
i++;
}
char[i]='\0'; :whistle:

n°366127
gooopil
pfiew
Posté le 18-04-2003 à 11:14:27  profilanswer
 

Code :
  1. char szTest[1024];
  2. memset (szTest, 0, sizeof (szTest));
  3. strcpy (szTest, genre);
  4. strcpy(tvInsert.item.pszText , szTest);


 
Fait pareil...

n°366133
theshockwa​ve
I work at a firm named Koslow
Posté le 18-04-2003 à 11:17:10  profilanswer
 

Gooopil a écrit :

Code :
  1. char szTest[1024];
  2. memset (szTest, 0, sizeof (szTest));
  3. strcpy (szTest, genre);
  4. strcpy(tvInsert.item.pszText , szTest);


 
Fait pareil...


 
(en soi, c'était logique : memset ne fait que mettre la mem à 0 ...)


---------------
last.fm
n°366139
gooopil
pfiew
Posté le 18-04-2003 à 11:18:03  profilanswer
 

polo021 a écrit :


ben ca doit etre ca. Alors j'ai contourne le probleme (je ne savais pas combien mettre comme parametre)
i=0;
while (i<string.getlenght())
{
char[i]= string.getat(i;)
i++;
}
char[i]='\0'; :whistle:  


 
Ben j'avais pas pensé à ca....Mais je sais pas si c'est très propre...Si j'arrive à faire marcher ca et que c'est suffisemment propre, c'est nickel....
 
Je connais pas strncpy ShockWave, c'est quoi l'avantage ?

n°366152
El_gringo
Posté le 18-04-2003 à 11:19:59  profilanswer
 

theShOcKwAvE a écrit :


 
humhum ... sizeof(char[1024]) ou sizeof sztest .... merci ...


 
Quoi !? :heink:

n°366153
El_gringo
Posté le 18-04-2003 à 11:20:29  profilanswer
 

Gooopil a écrit :

VC++ il connait pas msmet....


 
"memset", désolé :D

n°366155
El_gringo
Posté le 18-04-2003 à 11:21:27  profilanswer
 

Gooopil a écrit :


J'a essayé  

Code :
  1. char szTest[1024];
  2. strcpy (szTest, genre);
  3. strcpy(tvInsert.item.pszText , szTest);


 
Et ben c'est toujours pareil :)


 
Et tu passes ton truc au débugger ?
C'est quelle ligne qui merde ?

n°366157
theshockwa​ve
I work at a firm named Koslow
Posté le 18-04-2003 à 11:21:49  profilanswer
 


 
sizeof( /* insère ici un TYPE */);
 
ou
 
sizeof /* insère ici une VARIABLE */;
 
C'est mieux ...


---------------
last.fm
n°366159
gooopil
pfiew
Posté le 18-04-2003 à 11:22:13  profilanswer
 

El_gringo a écrit :


 
"memset", désolé :D


 
Pas grave :) Je suis un peu responsable aussi...Suffisait de remettre dans le bon ordre ;)

n°366166
gooopil
pfiew
Posté le 18-04-2003 à 11:24:23  profilanswer
 

El_gringo a écrit :


 
Et tu passes ton truc au débugger ?
C'est quelle ligne qui merde ?


 
C'est la dernière....c'est chelou ca non ? Pourtant si j'y met du text ds tvInsert.item.pszText ca marche....

n°366176
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 11:28:34  profilanswer
 


typedef struct tagTVINSERTSTRUCT {
    HTREEITEM hParent;
    HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
    union
    {
        TVITEMEX itemex;
        TVITEM item;
    } DUMMYUNIONNAME;
#else
    TVITEM item;
#endif
} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;


 


TVITEM
 
typedef struct tagTVITEM{
    UINT      mask;
    HTREEITEM hItem;
    UINT      state;
    UINT      stateMask;
    LPTSTR    pszText;
    int       cchTextMax;
    int       iImage;
    int       iSelectedImage;
    int       cChildren;
    LPARAM    lParam;
} TVITEM, FAR *LPTVITEM;
 
Specifies or receives attributes of a tree view item. This structure is identical to the TV_ITEM structure, but it has been renamed to follow current naming conventions. New applications should use this structure.  
 
mask  
Array of flags that indicate which of the other structure members contain valid data. When this structure is used with the TVM_GETITEM message, the mask member indicates the item attributes to retrieve. This member can be one or more of the following values: TVIF_CHILDREN  The cChildren member is valid.  
TVIF_HANDLE  The hItem member is valid.  
TVIF_IMAGE  The iImage member is valid.  
TVIF_PARAM  The lParam member is valid.  
TVIF_SELECTEDIMAGE  The iSelectedImage member is valid.  
TVIF_STATE  The state and stateMask members are valid.  
TVIF_TEXT  The pszText and cchTextMax members are valid.  
 
hItem  
Identifies the item to which this structure refers.  
state  
A set of bit flags and image list indexes that indicate the item's state. When setting the state of an item, the stateMask member indicates the bits of this member that are valid. When retrieving the state of an item, this member returns the current state for the bits indicated in the stateMask member.  
Bits 0 through 7 of this member contain the item state flags. For a list of possible item state flags, see Tree View Control Item States.  
 
Bits 8 through 11 of this member specify the one-based overlay image index. The overlay image is superimposed over the item's icon image. If these bits are zero, the item has no overlay image. To isolate these bits, use the TVIS_OVERLAYMASK mask. To set the overlay image index in this member, you should use the INDEXTOOVERLAYMASK macro. The image list's overlay images are set with the ImageList_SetOverlayImage function.  
 
Bits 12 through 15 of this member specify the state image index. The state image is displayed next to an item's icon to indicate an application-defined state. If these bits are zero, the item has no state image. To isolate these bits, use the TVIS_STATEIMAGEMASK mask. To set the state image index, you should use the INDEXTOSTATEIMAGEMASK macro. The state image index specifies the index of the image in the state image list that should be drawn. The state image list is specified with the TVM_SETIMAGELIST message.  
 
stateMask  
Bits of the state member that are valid. If you are retrieving an item's state, set the bits of the stateMask member to indicate the bits to be returned in the state member. If you are setting an item's state, set the bits of the stateMask member to indicate the bits of the state member that you want to set. To set or retrieve an item's overlay image index, set the TVIS_OVERLAYMASK bits. To set or retrieve an item's state image index, set the TVIS_STATEIMAGEMASK bits.  
pszText  
Address of a null-terminated string that contains the item text if the structure specifies item attributes. If this member is the LPSTR_TEXTCALLBACK value, the parent window is responsible for storing the name. In this case, the tree view control sends the parent window a TVN_GETDISPINFO notification message when it needs the item text for displaying, sorting, or editing and a TVN_SETDISPINFO notification message when the item text changes.  
If the structure is receiving item attributes, this member is the address of the buffer that receives the item text.  
cchTextMax  
Size of the buffer pointed to by the pszText member, in characters. If this structure is being used to set item attributes, this member is ignored.  
iImage  
Index in the tree view control's image list of the icon image to use when the item is in the nonselected state.  
If this member is the I_IMAGECALLBACK value, the parent window is responsible for storing the index. In this case, the tree view control sends the parent a TVN_GETDISPINFO notification message to get the index when it needs to display the image.  
iSelectedImage  
Index in the tree view control's image list of the icon image to use when the item is in the selected state.  
If this member is the I_IMAGECALLBACK value, the parent window is responsible for storing the index. In this case, the tree view control sends the parent a TVN_GETDISPINFO notification message to get the index when it needs to display the image.  
cChildren  
Flag that indicates whether the item has associated child items. This member can be one of the following values: zero  The item has no child items.  
one  The item has one or more child items.  
I_CHILDRENCALLBACK  The parent window keeps track of whether the item has child items. In this case, when the tree view control needs to display the item, the control sends the parent a TVN_GETDISPINFO notification message to determine whether the item has child items.  
 If the tree view control has the TVS_HASBUTTONS style, it uses this member to determine whether to display the button indicating the presence of child items. You can use this member to force the control to display the button even though the item does not have any child items inserted. This allows you to display the button while minimizing the control's memory usage by inserting child items only when the item is visible or expanded.  
 
lParam  
A 32-bit value to associate with the item.  


 
Donc  

Code :
  1. tvInsert.item.pszText = genre;


 
ca suffit amplement.

n°366190
gooopil
pfiew
Posté le 18-04-2003 à 11:32:00  profilanswer
 

VisualC++ a écrit :

 
Donc  

Code :
  1. tvInsert.item.pszText = genre;


 
ca suffit amplement.
 


 
 
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CString' (or there is no acceptable conversion)
 
Donc pas besoin de poster toute la msdn ;)  
:D


Message édité par gooopil le 18-04-2003 à 11:32:32
n°366191
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 11:33:28  profilanswer
 

Euh jsais pas comme tu compiles car je viens de faire le teste et ca marche moi

n°366192
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 11:34:26  profilanswer
 

OUPSssssssssssssss desole oublie un truc :p
 

Code :
  1. tvInsert.item.pszText = csGenre.GetBuffer(0);


 
faut le GetBuffer(0) pour te done un char*

n°366195
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 11:35:04  profilanswer
 

Gooopil a écrit :


 
Donc pas besoin de poster toute la msdn ;)  
:D


 
Ben faudrait la lire quand mm avant de poster ;)

n°366196
gooopil
pfiew
Posté le 18-04-2003 à 11:35:48  profilanswer
 

VisualC++ a écrit :

Euh jsais pas comme tu compiles car je viens de faire le teste et ca marche moi


 
:ouch:
J'ai revérifié, et effectivement ca ne compile pas du tout...
 
Je suis sous VC++ 6.0. Sinon je compile normalement j'imagine...
 
 

n°366200
polo021
Posté le 18-04-2003 à 11:37:09  profilanswer
 

VisualC++ a écrit :

OUPSssssssssssssss desole oublie un truc :p
 

Code :
  1. tvInsert.item.pszText = csGenre.GetBuffer(0);


 
faut le GetBuffer(0) pour te done un char*

Attends ca m'interesse la
avec string.GetBuffer(0) tout le contenu de la string est copie dans un tableau de char?

n°366204
gooopil
pfiew
Posté le 18-04-2003 à 11:39:37  profilanswer
 

VisualC++ a écrit :


 
Ben faudrait la lire quand mm avant de poster ;)


 
Hehe j'essaye mais c'est pas toujours facile  :crazy:
Sinon ton tvInsert.item.pszText = genre.GetBuffer(0);,
c'est de la bombe :D ca marche !
 
Visual C++ mon héro :love:
 
Merci pour l'aide tout le monde

n°366205
gooopil
pfiew
Posté le 18-04-2003 à 11:40:26  profilanswer
 

polo021 a écrit :

Attends ca m'interesse la
avec string.GetBuffer(0) tout le contenu de la string est copie dans un tableau de char?


 
Vi ca marche :D

n°366206
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 11:40:30  profilanswer
 

Qui a parle d une copie, item.pszText c l adresse d une chaine de car nul terminated, et via GetBuffer(0) tu recupe l adresse de la CString donc c tout.

n°366209
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 11:40:57  profilanswer
 

np  :hello:

n°366230
polo021
Posté le 18-04-2003 à 11:47:04  profilanswer
 

VisualC++ a écrit :

Qui a parle d une copie, item.pszText c l adresse d une chaine de car nul terminated, et via GetBuffer(0) tu recupe l adresse de la CString donc c tout.


 
ha ok , c'est bien ce que je pensais , donc le getbuffer ne sert en rien a retourner le contenu de la CString
 
char tmp[128];
CString str = "toto";
tmp = str.GetBuffer(0);
 
tmp ne vaudra pas "toto" , c'est bien ca?

n°366235
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-04-2003 à 11:51:21  profilanswer
 

polo021 a écrit :

tmp ne vaudra pas "toto" , c'est bien ca?


non ! GetBuffer te retourne un pointeur sur la string ! un char* quoi !


---------------
J'ai un string dans l'array (Paris Hilton)
n°366241
polo021
Posté le 18-04-2003 à 11:54:25  profilanswer
 

Harkonnen a écrit :


non ! GetBuffer te retourne un pointeur sur la string ! un char* quoi !


 :jap:  

n°366373
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 18-04-2003 à 14:06:57  profilanswer
 

VisualC++ a écrit :

OUPSssssssssssssss desole oublie un truc :p
 

Code :
  1. tvInsert.item.pszText = csGenre.GetBuffer(0);


 
faut le GetBuffer(0) pour te done un char*


 
C'est un peu n'importe quoi de faire un GetBuffer(0) sans faire de ReleaseBuffer() :
http://msdn.microsoft.com/library/ [...] buffer.asp
 
surtout quand un simple  

Code :
  1. tvInsert.item.pszText  = (LPCTSTR) genre;


suffit.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°366379
VisualC++
J'va y penser ...
Posté le 18-04-2003 à 14:09:52  profilanswer
 

Oui faut le release, mais bon comem d hab qqun au dessus l a dit (me semble Harko) vais pas ecrire non plus le soft a sa place.
 
aussi le LPCTSTR ca marche, mais j ai jamais dit TIENT VOILA L'UNIQUE SOLUTION

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Copie de CString vers LPSTR...

 

Sujets relatifs
HTTPS vers HTTP et inversementNetscape 7 et URL vers un fichier local
[html] comment créer un bouton redirigeant vers une url ?cast de CString vers int
[HTML] Lien vers une page et un cadre précis.chemin vers perl automatique pour fichier exécutable
Passer des caractères spéciaux vers les accents en phpcomment on copie une table dans une autre en Mysql
Conversion chaine de caracteres vers entier?? 
Plus de sujets relatifs à : Copie de CString vers LPSTR...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR