Re: StringCchCopy question
"RB" <NoMail@NoSpam> ha scritto nel messaggio
news:#Rf10oI5KHA.5880@TK2MSFTNGP04.phx.gbl...
I have the following downloaded example from some webpage I found on a
search
CHAR szRem[32];
hResult = StringCchCopy(szRem, 32/sizeof(TCHAR), "PM_REMOVE");
which of course seems ok to me ( for all I know ) and I could implement it
easy enough.
I don't like above code:
I think there is an incoherence, because CHAR is used in defining 'szRem'
variable, but there is a scale by /sizeof(TCHAR) in StringCchCopy call.
Moreover, the string literal "PM_REMOVE" is undecorated without _T/TEXT
macros.
So, the above code would run just fine in ANSI builds.
I would rewrite it using TCHAR's like this:
TCHAR szRem[32];
hResult = StringCchCopy( szRem, _countof(szRem), _T("PM_REMOVE"));
This should compile in both ANSI and Unicode builds.
_countof() macro returns the count of TCHAR's in szRem static array.
_T("...") decoration expands to "PM_REMOVE" (ANSI string) in ANSI builds,
and to L"PM_REMOVE" (Unicode string) in Unicode builds.
If you want to use sizeof() instead of _countof, you should use
StringCbCopy:
"StringCbCopy Function"
http://msdn.microsoft.com/en-us/library/ms647499(VS.85).aspx
sizeof() returns the count of bytes in the static array, instead _countof()
returns the count of TCHAR's.
sizeof() == _countof() only in ANSI builds, but not in Unicode builds (in
fact, sizeof(WCHAR) == 2 [bytes]).
---------------
But my curiousity probes me to wonder why the below code I wrote and got
to compile
with no errors would not work as well. Of more pertinantly please tell me
where and why
my code is wrong, unsafe or all of the above and what would be the "best"
way to
implement this.
LOGFONT NewFontLogStruct;
if ( StringCchCopy( ( TCHAR* ) &NewFontLogStruct.lfFaceName, sizeof (
NewFontLogStruct.lfFaceName), "Courier New" ) == S_OK);
{ //rest of program execution if the above StringCchCopy went ok }
In above code, you don't need the TCHAR* cast and address-of (&) operator.
In fact, lfFaceName is a TCHAR static array member of LOGFONT structure:
"LOGFONT Structure"
http://msdn.microsoft.com/en-us/library/dd145037(VS.85).aspx
Moreover, based on what I previously wrote about sizeof vs. _countof and
_T() decoration, you may want to call StringCchCopy like this:
HRESULT hr = StringCchCopy(
NewFontLogStruct.lfFaceName, // dest
_countof(NewFontLogStruct.lfFaceName), // size of dest in TCHARs
_T("Courier New") ); // _T() decoration
Or use StringCbCopy with sizeof:
HRESULT hr = StringCbCopy(
NewFontLogStruct.lfFaceName, // dest
sizeof(NewFontLogStruct.lfFaceName), // size of dest in bytes
_T("Courier New") ); // _T() decoration
Moreover, I would check the return code using SUCCEEDED macro instead of
comparing directly with S_OK:
http://msdn.microsoft.com/en-us/library/ms687197(VS.85).aspx
if ( SUCCEEDED(hr) )
...
or:
if ( SUCCEEDED( StringCchCopy( ... ) )
...
HTH,
Giovanni