OliverMller
OliverMller

Reputation: 173

Argument of type "char *" is incompatible with parameter of type "LPWSTR"

This has probably been asked before but I can't seem to find the solution:

std::string GetPath()
{
    char buffer[MAX_PATH];
    ::GetSystemDirectory(buffer,MAX_PATH);
    strcat(buffer,"\\version.dll");

    return std::string(buffer);
}

This returns an error stating:

argument of type "char *" is incompatible with parameter of type "LPWSTR"

So yeah. Anyone got an answer?

Upvotes: 11

Views: 26684

Answers (2)

paulm
paulm

Reputation: 5892

You need to use the ansi version:

std::string GetPath()
{
     char buffer[MAX_PATH] = {};
     ::GetSystemDirectoryA(buffer,_countof(buffer)); // notice the A
     strcat(buffer,"\\version.dll");

     return std::string(buffer);
 }

Or use unicode:

std::wstring GetPath()
{
     wchar_t buffer[MAX_PATH] = {};
     ::GetSystemDirectoryW(buffer,_countof(buffer)); // notice the W, or drop the W to get it "by default"
     wcscat(buffer,L"\\version.dll");

     return std::wstring(buffer);
 }

Rather than call the A/W versions explicitly you can drop the A/W and configure the whole project to use ansi/unicode instead. All this will do is change some #defines to replace foo with fooA/W.

Notice that you should use _countof() to avoid incorrect sizes depending on the buffers type too.

Upvotes: 19

kunal
kunal

Reputation: 966

If you compile your code using MultiByte support it will compile correctly,but when you compile it using Unicode flag it will give an error because in Unicode support ::GetSystemDirectoryA becomes ::GetSystemDirectoryW use consider using TCHAR instead of char.TCHAR is defined such that it becomes char in Multibyte flag and wchar_t with Unicode flag

TCHAR buffer[MAX_PATH];
::GetSystemDirectory(buffer,MAX_PATH);
_tcscat(buffer,_T("\\version.dll"));

You can use typedef for string /wstring so your code becomes independent

#ifdef UNICODE 
typedef wstring STRING;
#else
typedef string STRING;
#endif

STRING GetPath()
{
    TCHAR buffer[MAX_PATH];
    ::GetSystemDirectory(buffer,MAX_PATH);
    _tcscat(buffer,_T("\\version.dll"));

    return STRING(buffer);
}

Upvotes: 0

Related Questions