LPTSTR initialization

A

alex

how do i initialize an LPTSTR variable?

i'm trying to call a microsoft function

LONG QueryStringValue(
LPCTSTR pszValueName,
LPTSTR pszValue,
ULONG* pnChars
) throw( );pszValue is supposed to get the value i want but i need to
initialize it before i pass it to QueryStringValue, how do i initialize
it?the function (member of CRegKey) is described
here:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/
html/_atl_cregkey.asp
 
U

Unforgiven

alex said:
how do i initialize an LPTSTR variable?

i'm trying to call a microsoft function

LONG QueryStringValue(
LPCTSTR pszValueName,
LPTSTR pszValue,
ULONG* pnChars
) throw( );pszValue is supposed to get the value i want but i need to
initialize it before i pass it to QueryStringValue, how do i initialize
it?the function (member of CRegKey) is described
here:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/
html/_atl_cregkey.asp

This newsgroup is about standard C++ only, so Microsoft's APIs are
off-topic. However I think the question itself is enough C++ related to be
answered here.

What you need to realize is what an LPTSTR is. It's a typedef. An LPTSTR
actually is a TCHAR*, which depending on whether UNICODE is defined maps to
either char* or wchar_t*.

You need to initialize your LPTSTR to sufficient size for the string you
want to return. You do this in two ways, on the stack or on the heap (with
new):
On the stack:
TCHAR szValue[50];
ULONG nChars = 50;
key.QueryStringValue("SomeValue", szValue, &nChars);

On the heap:
LPTSTR szValue = new TCHAR[50];
ULONG nChars = 50;
key.QueryStringValue("SomeValue", szValue, &nChars);
// do something with szValue
delete[] szValue; // DO NOT FORGET THIS!
 
J

John Harrison

alex said:
how do i initialize an LPTSTR variable?

i'm trying to call a microsoft function

LONG QueryStringValue(
LPCTSTR pszValueName,
LPTSTR pszValue,
ULONG* pnChars
) throw( );pszValue is supposed to get the value i want but i need to
initialize it before i pass it to QueryStringValue, how do i initialize
it?the function (member of CRegKey) is described
here:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/
html/_atl_cregkey.asp

You need to allocate some memory, you should specify how much memory you
allocate in nChars.

E.g. suppose you decide to allocate 1000 characters

LPTSTR pszValue = new TCHAR[1000];
nChars = 1000;
xxxx.QueryStringFunction("yyyyy", pszValue, &nChars);
// do something with pszValue
delete[] pszValue; // free the allocated memory

john
 
J

JKop

alex posted:
how do i initialize an LPTSTR variable?

i'm trying to call a microsoft function

LONG QueryStringValue(
LPCTSTR pszValueName,
LPTSTR pszValue,
ULONG* pnChars
) throw( );pszValue is supposed to get the value i want but i need to
initialize it before i pass it to QueryStringValue, how do i initialize
it?the function (member of CRegKey) is described
here:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vc
lib/ html/_atl_cregkey.asp


typedef const char* LPCTSTR;

typedef char* LPTSTR;

typedef unsigned long ULONG;


char value_name[] = "BlahBlah";

char value[] = "BlahBlah";

unsigned long poo = 0;

QueryStringValue(value_name,value,&poo);

Or even:

QueryStringValue("Hello","Goodbye",&poo);


This function will alter the second and third arguments, as they're not
declared const.


Why does Microsoft give the intrinsic types new names?

Because the information that you've got and the header files you've got are
intended to be programming language NON-specific. If they used "char*", then
some-one writing in a language called Blerg wouldn't know what's going on.
So they've thought up of new names to be used with every computer
programming language.


-JKop
 
U

Unforgiven

JKop said:
alex posted:



typedef const char* LPCTSTR;

Wrong, LPCTSTR will expand to const wchar_t* if UNICODE is defined. Actually
the definition is:
typedef const TCHAR* LPCTSTR;

And TCHAR is:
#ifdef UNICODE
typedef wchar_t TCHAR
#else
typedef char TCHAR
#endif
typedef char* LPTSTR;

typedef unsigned long ULONG;


char value_name[] = "BlahBlah";

char value[] = "BlahBlah";

unsigned long poo = 0;

QueryStringValue(value_name,value,&poo);

Wrong, the third parameter of QueryStringValue must be the size in TCHARs of
the buffer pointed to by the second parameter. It will receive the amount of
TCHARs written. So it shouldn't be 0 initially.
Or even:

QueryStringValue("Hello","Goodbye",&poo);


This function will alter the second and third arguments, as they're not
declared const.


Why does Microsoft give the intrinsic types new names?

Because the information that you've got and the header files you've got
are
intended to be programming language NON-specific. If they used "char*",
then
some-one writing in a language called Blerg wouldn't know what's going on.
So they've thought up of new names to be used with every computer
programming language.

Not really. The header files are meant for C(++), they use C syntax so it'd
be a little hard to use them from a language that doesn't support C syntax.
Also, this particular function is not part of the Win32 API, but of ATL,
which is meant for C++ exclusively.

The main reason Microsoft renames intrinsic types is to standardise their
usage across the API, and to make them platform independant. With platform I
don't mean Windows vs. Unix, but Win16 vs. Win32 vs. Win64 and in the past
also Windows NT on the Alpha processors. For instance the LPARAM type, which
is used for Windows messaging, should be large enough to hold a pointer. So
on Win32 it'll expand to unsigned int, but on Win64 it's unsigned __int64.
Also, types such as WORD, DWORD are of a fixed length, regardless of what
word length your system has (which is a bit confusing, since it means DWORD
on Win32 is only a single machine word long (32 bits)). Then there are the
main pointer arithmic types such as INT_PTR which are guaranteed to have the
same length as a pointer.

In this situation we see another use of the typedefs. All string related
types with a T in them (TCHAR, LPTSTR, LPCTSTR) expand to either ansi or
wide characters depending on whether UNICODE is defined. In conjunction with
the _T macro you can use those types to write a program that can compile for
ansi and unicode without modification.
 
P

Pete C.

JKop wrote:
typedef const char* LPCTSTR;

typedef char* LPTSTR;

typedef unsigned long ULONG;


On some systems. Don't rely on it.
This function will alter the second and third arguments, as they're
not declared const.

Not neccessarily. Non-const does not require that the variable be altered;
const just prevents it.
Why does Microsoft give the intrinsic types new names?

Because the information that you've got and the header files you've
got are intended to be programming language NON-specific. If they
used "char*", then some-one writing in a language called Blerg
wouldn't know what's going on. So they've thought up of new names to
be used with every computer programming language.

Plus it's more portable. If, for example, you use TCHAR correctly you can
compile for both WinCE and `95 with the same code.

- Pete
 
J

JKop

Pete C. posted:
Not neccessarily. Non-const does not require that the variable be
altered; const just prevents it.


You are correct, although if the function does not alter the variables, it's
stupid for not declaring them const.


-JKop
 
J

John Harrison

JKop said:
Pete C. posted:



You are correct, although if the function does not alter the variables, it's
stupid for not declaring them const.

But the function does alter the variable, RTFM.

john
 
P

puppet_sock

alex said:
how do i initialize an LPTSTR variable?

i'm trying to call a microsoft function

LONG QueryStringValue(
LPCTSTR pszValueName,
LPTSTR pszValue,
ULONG* pnChars
) throw( );pszValue is supposed to get the value i want but i need to
initialize it before i pass it to QueryStringValue, how do i initialize
it?the function (member of CRegKey) is described
here:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/
html/_atl_cregkey.asp

Ok, you are kind of out of scope for topic here. This is a library
fcn in a vendor specific librry. And LPTSTR is not a standard type.
So, you should really be asking in one of the Microsoft or Windows
related groups.

But just guessing... It *looks* like a pointer. The psz in front of
it seems to say it's a pointer to a string terminated by a null.
So, presumably you need to point it at such before the call.
Presumably your docs will tell you what.
Socks
 
A

alex

Unforgiven said:
alex said:
how do i initialize an LPTSTR variable?

i'm trying to call a microsoft function

LONG QueryStringValue(
LPCTSTR pszValueName,
LPTSTR pszValue,
ULONG* pnChars
) throw( );pszValue is supposed to get the value i want but i need to
initialize it before i pass it to QueryStringValue, how do i initialize
it?the function (member of CRegKey) is described
here:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/
html/_atl_cregkey.asp

This newsgroup is about standard C++ only, so Microsoft's APIs are
off-topic. However I think the question itself is enough C++ related to be
answered here.

What you need to realize is what an LPTSTR is. It's a typedef. An LPTSTR
actually is a TCHAR*, which depending on whether UNICODE is defined maps to
either char* or wchar_t*.

You need to initialize your LPTSTR to sufficient size for the string you
want to return. You do this in two ways, on the stack or on the heap (with
new):
On the stack:
TCHAR szValue[50];
ULONG nChars = 50;
key.QueryStringValue("SomeValue", szValue, &nChars);

On the heap:
LPTSTR szValue = new TCHAR[50];
ULONG nChars = 50;
key.QueryStringValue("SomeValue", szValue, &nChars);
// do something with szValue
delete[] szValue; // DO NOT FORGET THIS!

this provides the proper initialization i needed, thanks, thanks to everyone
else who participated as well!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top