Copie de CString vers LPSTR...

Copie de CString vers LPSTR... - C++ - Programmation

Marsh Posté le 18-04-2003 à 10:07:16    

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 :)
 

Reply

Marsh Posté le 18-04-2003 à 10:07:16   

Reply

Marsh Posté le 18-04-2003 à 10:44:50    

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

Reply

Marsh Posté le 18-04-2003 à 10:49:14    

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
Reply

Marsh Posté le 18-04-2003 à 10:51:00    

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


---------------
last.fm
Reply

Marsh Posté le 18-04-2003 à 10:54:02    

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)
Reply

Marsh Posté le 18-04-2003 à 10:58:22    

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...) ?

Reply

Marsh Posté le 18-04-2003 à 11:02:24    

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)
Reply

Marsh Posté le 18-04-2003 à 11:03:04    

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 ?

Reply

Marsh Posté le 18-04-2003 à 11:04:35    

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)

Reply

Marsh Posté le 18-04-2003 à 11:04:46    

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:

Reply

Marsh Posté le 18-04-2003 à 11:04:46   

Reply

Marsh Posté le 18-04-2003 à 11:08:50    

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
Reply

Marsh Posté le 18-04-2003 à 11:09:35    

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
Reply

Marsh Posté le 18-04-2003 à 11:11:31    

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)
Reply

Marsh Posté le 18-04-2003 à 11:11:53    

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
Reply

Marsh Posté le 18-04-2003 à 11:13:52    

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:

Reply

Marsh Posté le 18-04-2003 à 11:14:27    

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


 
Fait pareil...

Reply

Marsh Posté le 18-04-2003 à 11:17:10    

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
Reply

Marsh Posté le 18-04-2003 à 11:18:03    

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 ?

Reply

Marsh Posté le 18-04-2003 à 11:19:59    

theShOcKwAvE a écrit :


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


 
Quoi !? :heink:

Reply

Marsh Posté le 18-04-2003 à 11:20:29    

Gooopil a écrit :

VC++ il connait pas msmet....


 
"memset", désolé :D

Reply

Marsh Posté le 18-04-2003 à 11:21:27    

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 ?

Reply

Marsh Posté le 18-04-2003 à 11:21:49    


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


---------------
last.fm
Reply

Marsh Posté le 18-04-2003 à 11:22:13    

El_gringo a écrit :


 
"memset", désolé :D


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

Reply

Marsh Posté le 18-04-2003 à 11:24:23    

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....

Reply

Marsh Posté le 18-04-2003 à 11:28:34    


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.

Reply

Marsh Posté le 18-04-2003 à 11:32:00    

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
Reply

Marsh Posté le 18-04-2003 à 11:33:28    

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

Reply

Marsh Posté le 18-04-2003 à 11:34:26    

OUPSssssssssssssss desole oublie un truc :p
 

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


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

Reply

Marsh Posté le 18-04-2003 à 11:35:04    

Gooopil a écrit :


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


 
Ben faudrait la lire quand mm avant de poster ;)

Reply

Marsh Posté le 18-04-2003 à 11:35:48    

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...
 
 

Reply

Marsh Posté le 18-04-2003 à 11:37:09    

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?

Reply

Marsh Posté le 18-04-2003 à 11:39:37    

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

Reply

Marsh Posté le 18-04-2003 à 11:40:26    

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

Reply

Marsh Posté le 18-04-2003 à 11:40:30    

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.

Reply

Marsh Posté le 18-04-2003 à 11:40:57    

np  :hello:

Reply

Marsh Posté le 18-04-2003 à 11:47:04    

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?

Reply

Marsh Posté le 18-04-2003 à 11:51:21    

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)
Reply

Marsh Posté le 18-04-2003 à 11:54:25    

Harkonnen a écrit :


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


 :jap:  

Reply

Marsh Posté le 18-04-2003 à 14:06:57    

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
Reply

Marsh Posté le 18-04-2003 à 14:09:52    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed