|
Nelek wrote: Anyway... If the char m_cName is set to 100, would it then works with longer names? or still have problems with the length?
No. AFAIK CString can hold several thousand (virtually, an infinite number of) characters, hence your code will not handle properly big CStrings.
On the overall, your code:
Nelek wrote:
m_cName [20];
LPTSTR CMyClass::TransformTextFormat (const CString szString)
{
for (int i = 0; i < 20; i++)
m_cName[i] = NULL;
for (int j = 0; j < szString.GetLength (); j++)
m_cName[j] = szString[j];
return &m_cName[0];
}
has, IMHO several flaws:
(1) you should not define variables in header files (only declarations there). If you include the same header file in some source files (that is the usual scenario) then you experience compiler errors.
(2) The function, as it stands, relies on the factthat its argument has a lenght less than a certain amount (unless you use Design by contract technique...). This is dangerous: you have to handle bigger input buffers, without going out of the array boundaries (e.g. copying maximum 19 characters - you need the trailing NULL).
(3) code is inefficient, you first initialize to NULL a characther at time, then copy, a character at time, the CString into your buffer. The first operation is not required, the second one may be performed copying the whole buffer at once (of course you need to NULL terminate the string).
BTW efficience may be not a ISSUE, but reliability must be.
Hope that helps.
(3)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Yes, it is a good explanation. I will take it in consideration. Thanks for the tips and corrections.
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
|
|
|
|
|
Nelek wrote: LPTSTR CMyClass::TransformTextFormat (const CString szString)
Microsoft intended us to take LPCTSTR and to return CString
CString CMyClass::TransformTextFormat (LPCTSTR szString)
And it works! You get rid of the buffer-lenght issue, the handing out of references to private data and the uncertain ownership of new ed memory all at once!
A std::string would work the same way.
Failure is not an option - it's built right in.
|
|
|
|
|
Maybe,
but it was the only solution I found to deal a problem with an MFC function that required a LPCSTR as parameter. I tried with CStrings, with &strings, with CString* and everything I thought in that moment. No one worked, because of that I make my own solution. It is not the finest solution, I know... but it works good and I was able to finish my programm
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
|
|
|
|
|
Nelek wrote: an MFC function that required a LPCSTR as parameter. I tried with CStrings, with &strings, with CString* and everything I thought in that moment. No one worked
Huh?
When you've got a CString, and you use it as a parameter to a function taking a LPCTSTR, the operator LPCTSTR() Kicks in and converts.
This wont work with a LPTSTR, though. Notice the missing C!
Here, as the function will write the String, you would need to use GetBuffer( length) / ReleaseBuffer() .
Failure is not an option - it's built right in.
|
|
|
|
|
Please have a look at CString::operator LPCTSTR
CString strTemp;
(LPCTSTR)strTemp;
Regards,
Paresh.
|
|
|
|
|
...to find out that it is useless (hint: OP asked for LPSTR ).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
You could do this (if you're feeling adventurous):
CString sMyString("1234567890");
ThisFunctionNeedsLPSTR((LPSTR)(LPCTSTR)sMyString);
The best advise (as already stated by others) is to use GetBuffer() /ReleaseBuffer() .
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
That would not be a good idea.
Steve
|
|
|
|
|
It has its right E.G. in CListView or CTreeView, where structs are used for reading and writing, and hence have the strings defined as LPTSTR.
When I am writing into the control, it will not ever alter the string I gave it. So I sometimes just shut up the compiler by using the big club of a double cast.
Failure is not an option - it's built right in.
|
|
|
|
|
Personally, I always use the GetBuffer() , ReleaseBuffer() combo.
Nobody can give you wiser advice than yourself. - Cicero
|
|
|
|
|
And up to now... I will make the same :P
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
|
|
|
|
|
Hi
I am trying to disable a menu item, but it is only disabling it for me and not graying it out.
For instance I have a menu as following:
File
->Open
->Save
So the "Open" and "Save" are grayed out and disabled, but "File" is not.
How can I make "File" menu item be grayed out on top of being disabled?
By the way - I am using the ON_UPDATE_COMMAND_UI_RANGE command.
Thanks
|
|
|
|
|
Currently inputting characters into a string varible in the CString class
How can i cut a set of characters from the string into another varible?
for example: - in the string is "Project"
how can i extract just the "Pro" part out of it into a varible?
Thanks for your help
|
|
|
|
|
You can use the String splitting functions of CString Left, Right, Mid. For searching after certain characters you can use the Find methods.
But you have to keep in mind that those are index based functions, so you have to either rely on fixed index positions or your string has to contain nearly the same content.
|
|
|
|
|
AlexDrummer wrote: for example: - in the string is "Project"
how can i extract just the "Pro" part out of it into a varible?
CString s = CString("Project").Left(3);
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hello coders,
I need an help regarding adding a button to datagridview control in my windows application.
Also i am using dataset to fill the datagridview.
Please find me the way of doing the thing.
Thanks
sulabh
|
|
|
|
|
how to get the guid of the usb flash drive inserted through mfc?
|
|
|
|
|
As far as I know there is no special MFC API for something like this.
You will probably need to call the relevant Win32API.
I have no idea which this may be, though, as I did not understand your request.
Please rephrase what you want to do.
Failure is not an option - it's built right in.
|
|
|
|
|
when we insert a usb flash drive an id (which is of 128 bit) will be generated automatically. i need an api to get this id for the inserted flash drive
|
|
|
|
|
Call ::RegisterDeviceNotification() from your application to receive WM_DEVICECHANGE messages, more info here[^].
Set it up properly so you can get a DEV_BROADCAST_DEVICEINTERFACE structure appointed by the lParam parameter in the message which contains the GUID, more info here[^].
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
This may not be too helpful but...
I had to do a similar job a couple of months ago, detect USB drive insertion accross as wide a range on Windows OS versions as possible and determine the drive letter mapping. It turned out to be a 2 week job and required downloading the Windows 2000 DDK to get the right headers to make it work. I can't send you the code as it was for my work but you might want to clear some space in your schedule for this one. You'll need the Device Notification stuff already mentioned above, that is the way to go. It probably won't work at first and the docs are bad but stick at it, It can be done
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
|
paras_s12 wrote: now i want that when i click on browse button c drive open
and when i choose a file for uploading
For this check the CFileDialog class.
|
|
|
|
|
Thanks sir
can i get this answer in detail please
hi
|
|
|
|