You have defined _UNICODE
and/or UNICODE
in Builder and not defined it in VC.
Most Windows APIs come in 2 flavours the ANSI flavour and the UNICODE flavour.
For, when you call SetWindowText
, there really is no SetWindowText
functions. Instead there are 2 different functions
- SetWindowTextA
which takes an ANSI string
and
- SetWindowTextW
which takes a UNICODE string.
If your program is compiled with /DUNICODE /D_UNICODE, SetWindowText
maps to SetWindowTextWwhich expects a
const wchar_t *`.
If your program is compiled without these macros defined, it maps to SetWindowTextA
which takes a const char *
.
The windows headers typically do something like this to make this happen.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
Likewise, there are 2 GetFileAttributes
.
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName);
In VC, you haven't defined UNICODE/_UNICODE & hence you are able to pass string::c_str()
which returns a char *
.
In Builder, you probably have defined UNICODE/_UNICODE & it expects a wchar_t *
.
You may not have done this UNICODE/_UNICODE thing explicitly - may be the IDE is doing it for you - so check the options in the IDE.
You have many ways of fixing this
- find the UNICODE/_UNICODE option in the IDE and disable it.
or
- use
std::w_string
- then c_str()
will return a wchar_t *
or
- Call
GetFileAttributesA
directly instead of GetFileAttributes
- you will need to do this for every other Windows API which comes with these 2 variants.