I've inherited some C++ code that I'm trying to convert from VC++ 6.0 to
VC++ 2005 and was wondering if anyone could help as I haven't done any C++
programming in several years.
The code is basically trying to populate a struct that is defined in the
sspi.h file. The compile error that I'm getting is "error C2440:
'initializing' cannot convert from wchar_t* to unsigned short*".
Here is the code to populate the struct:
const wchar_t* pszAuthority
const wchar_t* pszPrincipal
const wchar_t* pszPassword
SEC_WINNT_AUTH_IDENTITY_EX authIdent = {
SEC_WINNT_AUTH_IDENTITY_VERSION,
sizeof authIdent,
const_cast<wchar_t*>(pszPrincipal), //*****Compilie error here*******
lstrlenW(pszPrincipal),
const_cast<wchar_t*>(pszAuthority), //*****Compilie error here*******
lstrlenW(pszAuthority),
const_cast<wchar_t*>(pszPassword), //*****Compilie error here******
lstrlenW(pszPassword),
SEC_WINNT_AUTH_IDENTITY_UNICODE,
0,
0};
The struct is defined as follows in the sspi.h header file
#define SEC_WINNT_AUTH_IDENTITY_EX SEC_WINNT_AUTH_IDENTITY_EXW
typedef struct _SEC_WINNT_AUTH_IDENTITY_EXW {
unsigned long Version;
unsigned long Length;
unsigned short SEC_FAR *User;
unsigned long UserLength;
unsigned short SEC_FAR *Domain;
unsigned long DomainLength;
unsigned short SEC_FAR *Password;
unsigned long PasswordLength;
unsigned long Flags;
unsigned short SEC_FAR * PackageList;
unsigned long PackageListLength;
} SEC_WINNT_AUTH_IDENTITY_EXW, *PSEC_WINNT_AUTH_IDENTITY_EXW;
I guess the question is what is the best way to "cast" a wchar_t* to a
unsigned short* so that it will compile and run correctly? Any help or
feedback would be greatly appreciated.
--
Anthony Yott
It's arguably a bug in the Platform SDK. For a long time, wchar_t was
not a distinct type but simply a typedef for unsigned short, so sspi.h
header got away with this blatant abuse. Starting with VC7, a compiler
option became available to make wchar_t a predefined fundamental type,
but it was off by default. In VC8 (aka VC 2005) this option is the
default (you can still switch to old behavior with /Zc:wchar_t- but I
won't recommend it).
The easiest solution in the short term is simply to do reinterpret_cast:
reinterpret_cast<unsigned short*>(pszPrincipal),
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925