Error converting string to LPCTSTR with Qt
-
Hello i was converting my string to LPCTSTR like this code:
string subclave="Hello"; string valor="TheValue"; LPCTSTR _subclave = TEXT(subclave.c_str()); LPCTSTR _valor = TEXT(valor.c_str());
But qt show me these errors why?
I can't use c_str or why these errors?
-
Hi @RIVOPICO,
The problem is that TEXT is not a function, but a macro. I don't have Windows handy, but if I remember correctly, it simply adds an
L
prefix a string literal (when Unicode is enabled). So, for example,TEXT("foo")
becomesL"foo"
, which is something the compiler understands, butTEXT(valor.c_str())
becomesLvalor.c_str()
, which is why the compiler is looking for a (non-existent)Lvalor
variable.The solution here, is to not use the
TEXT
macro. Instead, do something like:#ifdef UNICODE LPTSTR _valor = (LPTSTR)valor.utf16(); #else LPTSTR _valor = (LPTSTR)valor.toLocal8Bit().constData(); #endif
There's probably a better way to convert to
LPTSTR
(someone else might suggest something better?), but you get the idea.Cheers.
-
@Paul-Colby The beauty and blessing of the Windows API :)
-
Since you're not using unicode anyway you can also undefine
UNICODE
and your original code will work.
Put in your .pro fileDEFINES -= UNICODE
But to be honest your usage of the TEXT macro is wrong anyway (for reasons @Paul-Colby mentioned) so you might just as well stop pretending and use the ANSI types explicitly and don't care for the
UNICODE
definition:
LPCSTR _valor = valor.c_str();
In fact, if you're passing that to some WinAPI function, you don't need to do that at all. You can just directly use the variable, e.g.
SetWindowTextA(hwnd, valor.c_str()); //or with UNICODE undefined: SetWindowText(hwnd, valor.c_str());
-
@Paul-Colby said in Error converting string to LPCTSTR with Qt:
LPTSTR _valor = (LPTSTR)valor.toLocal8Bit().constData();
That's returning a pointer to a temporary, though.
-
If i remember well. You need to call a windows function to allocate a custom struct. Assing string pointer in the correct field and pass a pointer to the function to no the first word of the struct. After using it u should deallocate it with other windows call. I dont have my computer here but i remember that
-
@Chris-Kawa Sorry i dont understand very well. You are saying me that i dont need to do the conversion to get to work with my winapi function? But where i willl put this text which variable?
SetWindowTextA(hwnd, valor.c_str()); //or with UNICODE undefined: SetWindowText(hwnd, valor.c_str());
-
@RIVOPICO said in Error converting string to LPCTSTR with Qt:
But where i willl put this text which variable?
Now I'm not sure I understand. You put it wherever you want. For example:
LPCSTR foo = "Hello!"; SetWindowTextA(hwnd, foo);
or
LPCWSTR foo = L"Hello!"; SetWindowTextW(hwnd, foo);
or
std::string foo = "Hello!"; SetWindowTextA(hwnd, foo.c_str());
or
QString foo = "Hello"; SetWindowTextW(hwnd, (LPCWSTR)foo.utf16());
-
@Chris-Kawa But for example if i have this function:
HRSRC res=FindResource(NULL,L"->SetWindowsTextA?",RT_RCDATA);
How i can use SetWindowText? I must to save the result in my variable?. In other words, how i can apply setwindowstext to save in a var and put in my second argument?
-
HRSRC res=FindResource(NULL,L"->SetWindowsTextA?",RT_RCDATA);
That doesn't make any sense whatsoever.
SetWindowsText
was just an example of WinAPI function since you never said what function you're interested in. Replace it with whatever function you need. If it'sFindResource
then you can do any of these:HRSRC res = FindResourceA(NULL, "SomeResourceName", RT_RCDATA);
or
HRSRC res = FindResourceW(NULL, L"SomeResourceName", RT_RCDATA);
or
LPCSTR foo = "SomeResourceName"; HRSRC res = FindResourceA(NULL, foo, RT_RCDATA);
or
LPCWSTR foo = L"SomeResourceName"; HRSRC res = FindResourceW(NULL, foo, RT_RCDATA);
or
QString foo = "SomeResourceName"; HRSRC res = FindResourceW(NULL, (LPCWSTR)foo.utf16(), RT_RCDATA);
or any of the dozen other possibilities.
-
@Chris-Kawa said in Error converting string to LPCTSTR with Qt:
LPCSTR foo = "SomeResourceName";
HRSRC res = FindResourceA(NULL, foo, RT_RCDATA);When i use in qt findresourceA all time take me error i tried the two ways.
code:HRSRC res = FindResourceA(NULL, "SomeResourceName", RT_RCDATA);
error:
error: C2664: 'HRSRC FindResourceA(HMODULE,LPCSTR,LPCSTR)' : el argumento 3 no puede convertirse de 'LPWSTR' a 'LPCSTR' the types are not related; the conversion require reinterpret_cast, conversi¢n of style of C or conversi¢n of style of function
second way:
LPCSTR foo = "SomeResourceName"; HRSRC res = FindResourceA(NULL, foo, RT_RCDATA);
error:
error: C2664: 'HRSRC FindResourceA(HMODULE,LPCSTR,LPCSTR)' : el argumento 3 no puede convertirse de 'LPWSTR' a 'LPCSTR' Los tipos se¤alados no est n relacionados; la conversi¢n requiere reinterpret_cast, conversi¢n de estilo de C o conversi¢n de estilo de funci¢n
i can't use the Ansi version with Qt and i dont know why,
i tried the ex version but not seems to work too:
LPCSTR foo = "SomeResourceName"; WORD myVariable; HRSRC res = FindResourceExA(NULL, foo, RT_RCDATA,myVariable);
error:
error: C2664: 'HRSRC FindResourceExA(HMODULE,LPCSTR,LPCSTR,WORD)' : el argumento 3 no puede convertirse de 'LPWSTR' a 'LPCSTR' the types are not related; the conversion require reinterpret_cast, conversi¢n of style of C or conversi¢n of style of function
-
Hi
Dont it complain about param 3 ?error: C2664: 'HRSRC FindResourceA(HMODULE,LPCSTR,LPCSTR)' : el argumento 3 no puede convertirse de 'LPWSTR' a 'LPCSTR'
so it seems its RT_RCDATA that it barf at ?
-
RT_RCDATA
is a macro that expands toMAKEINTRESOURCE(10)
, which expands to eitherMAKEINTRESOURCEA(10)
orMAKEINTRESOURCEW(10)
when UNICODE is defined or not.
So just replaceRT_RCDATA
in my exmples with eitherMAKEINTRESOURCEA(10)
orMAKEINTRESOURCEW(10)
. -
@Chris-Kawa Thanks a lot your answer solve my dude thanks a lot. The system of resources of Qt is awesome and more easy to use so it's better. Anyways i was trying to understand more about windows api and with these explications i understand now thanks.