www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - LPOLESTR* to string

reply Andre <andre s-e-a-p.de> writes:
Hi,

one hour trying to get a string out of LPOLESTR*.
What is the correct command to get rgszNames as string?

HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, 
LCID lcid, DISPID* rgDispId){}

With following command I only get the first character
writeln(to!string(**rgszNames));

Kind regards
André
Feb 10 2014
parent reply Mike Parker <aldacron gmail.com> writes:
On 2/11/2014 1:32 AM, Andre wrote:
 Hi,

 one hour trying to get a string out of LPOLESTR*.
 What is the correct command to get rgszNames as string?

 HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
 LCID lcid, DISPID* rgDispId){}

 With following command I only get the first character
 writeln(to!string(**rgszNames));

 Kind regards
 André
I would assume to!string(*rgszNames). Assuming LPOLESTR is char* or some such, then LPOLESTR** is char**, so **LPOLESTR would be the first character in the string, and *LPOLESTR would be the char* string.
Feb 10 2014
parent reply Andre <andre s-e-a-p.de> writes:
Am 10.02.2014 17:53, schrieb Mike Parker:
 On 2/11/2014 1:32 AM, Andre wrote:
 Hi,

 one hour trying to get a string out of LPOLESTR*.
 What is the correct command to get rgszNames as string?

 HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
 LCID lcid, DISPID* rgDispId){}

 With following command I only get the first character
 writeln(to!string(**rgszNames));

 Kind regards
 André
I would assume to!string(*rgszNames). Assuming LPOLESTR is char* or some such, then LPOLESTR** is char**, so **LPOLESTR would be the first character in the string, and *LPOLESTR would be the char* string.
to!string(*rgszNames) outputs a number instead of a name. I think I am a step further, rgszNames is an array but also with to!string(*rgszNames[0]) only the first character of my method is given back. Kind regards André
Feb 10 2014
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Monday, 10 February 2014 at 17:08:27 UTC, Andre wrote:
 Am 10.02.2014 17:53, schrieb Mike Parker:
 On 2/11/2014 1:32 AM, Andre wrote:
 Hi,

 one hour trying to get a string out of LPOLESTR*.
 What is the correct command to get rgszNames as string?

 HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT 
 cNames,
 LCID lcid, DISPID* rgDispId){}

 With following command I only get the first character
 writeln(to!string(**rgszNames));

 Kind regards
 André
I would assume to!string(*rgszNames). Assuming LPOLESTR is char* or some such, then LPOLESTR** is char**, so **LPOLESTR would be the first character in the string, and *LPOLESTR would be the char* string.
to!string(*rgszNames) outputs a number instead of a name. I think I am a step further, rgszNames is an array but also with to!string(*rgszNames[0]) only the first character of my method is given back. Kind regards André
std.conv.to knows about char* c-style strings, but not wchar* c-style strings like LPOLESTR. The number you are getting is the pointer to the first wchar. I'm not sure what is the best way to do this as it's not something I've come across before, hopefully someone else will know.
Feb 10 2014
next sibling parent "John Colvin" <john.loughran.colvin gmail.com> writes:
On Monday, 10 February 2014 at 17:29:33 UTC, John Colvin wrote:
 On Monday, 10 February 2014 at 17:08:27 UTC, Andre wrote:
 Am 10.02.2014 17:53, schrieb Mike Parker:
 On 2/11/2014 1:32 AM, Andre wrote:
 Hi,

 one hour trying to get a string out of LPOLESTR*.
 What is the correct command to get rgszNames as string?

 HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT 
 cNames,
 LCID lcid, DISPID* rgDispId){}

 With following command I only get the first character
 writeln(to!string(**rgszNames));

 Kind regards
 André
I would assume to!string(*rgszNames). Assuming LPOLESTR is char* or some such, then LPOLESTR** is char**, so **LPOLESTR would be the first character in the string, and *LPOLESTR would be the char* string.
to!string(*rgszNames) outputs a number instead of a name. I think I am a step further, rgszNames is an array but also with to!string(*rgszNames[0]) only the first character of my method is given back. Kind regards André
std.conv.to knows about char* c-style strings, but not wchar* c-style strings like LPOLESTR. The number you are getting is the pointer to the first wchar. I'm not sure what is the best way to do this as it's not something I've come across before, hopefully someone else will know.
https://d.puremagic.com/issues/show_bug.cgi?id=8384
Feb 10 2014
prev sibling parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Monday, 10 February 2014 at 17:29:33 UTC, John Colvin wrote:
 On Monday, 10 February 2014 at 17:08:27 UTC, Andre wrote:
 Am 10.02.2014 17:53, schrieb Mike Parker:
 On 2/11/2014 1:32 AM, Andre wrote:
 Hi,

 one hour trying to get a string out of LPOLESTR*.
 What is the correct command to get rgszNames as string?

 HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT 
 cNames,
 LCID lcid, DISPID* rgDispId){}

 With following command I only get the first character
 writeln(to!string(**rgszNames));

 Kind regards
 André
I would assume to!string(*rgszNames). Assuming LPOLESTR is char* or some such, then LPOLESTR** is char**, so **LPOLESTR would be the first character in the string, and *LPOLESTR would be the char* string.
to!string(*rgszNames) outputs a number instead of a name. I think I am a step further, rgszNames is an array but also with to!string(*rgszNames[0]) only the first character of my method is given back. Kind regards André
std.conv.to knows about char* c-style strings, but not wchar* c-style strings like LPOLESTR. The number you are getting is the pointer to the first wchar. I'm not sure what is the best way to do this as it's not something I've come across before, hopefully someone else will know.
I'm pretty sure you can get a wstring like this: import core.stdc.wchar_ : wcslen; auto rgszNamesWStr = to!wstring(rgszNames[0][0 .. wcslen(rgszNames[0])]); Or if you're sure you don't have any wide characters: auto rgszNamesStr = to!string(rgszNames[0][0 .. wcslen(rgszNames[0])]);
Feb 10 2014
next sibling parent Andre <andre s-e-a-p.de> writes:
Am 10.02.2014 18:54, schrieb John Colvin:
 On Monday, 10 February 2014 at 17:29:33 UTC, John Colvin wrote:
 On Monday, 10 February 2014 at 17:08:27 UTC, Andre wrote:
 Am 10.02.2014 17:53, schrieb Mike Parker:
 On 2/11/2014 1:32 AM, Andre wrote:
 Hi,

 one hour trying to get a string out of LPOLESTR*.
 What is the correct command to get rgszNames as string?

 HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
 LCID lcid, DISPID* rgDispId){}

 With following command I only get the first character
 writeln(to!string(**rgszNames));

 Kind regards
 André
I would assume to!string(*rgszNames). Assuming LPOLESTR is char* or some such, then LPOLESTR** is char**, so **LPOLESTR would be the first character in the string, and *LPOLESTR would be the char* string.
to!string(*rgszNames) outputs a number instead of a name. I think I am a step further, rgszNames is an array but also with to!string(*rgszNames[0]) only the first character of my method is given back. Kind regards André
std.conv.to knows about char* c-style strings, but not wchar* c-style strings like LPOLESTR. The number you are getting is the pointer to the first wchar. I'm not sure what is the best way to do this as it's not something I've come across before, hopefully someone else will know.
I'm pretty sure you can get a wstring like this: import core.stdc.wchar_ : wcslen; auto rgszNamesWStr = to!wstring(rgszNames[0][0 .. wcslen(rgszNames[0])]); Or if you're sure you don't have any wide characters: auto rgszNamesStr = to!string(rgszNames[0][0 .. wcslen(rgszNames[0])]);
Yes:) now it works. Thanks a lot. Kind regards André
Feb 10 2014
prev sibling parent reply "Jakob Ovrum" <jakobovrum gmail.com> writes:
On Monday, 10 February 2014 at 17:54:14 UTC, John Colvin wrote:
 Or if you're sure you don't have any wide characters:

 auto rgszNamesStr = to!string(rgszNames[0][0 .. 
 wcslen(rgszNames[0])]);
to!string on a well-formed UTF-16 string is always safe. It will transcode to UTF-8.
Feb 10 2014
parent "John Colvin" <john.loughran.colvin gmail.com> writes:
On Monday, 10 February 2014 at 22:06:14 UTC, Jakob Ovrum wrote:
 On Monday, 10 February 2014 at 17:54:14 UTC, John Colvin wrote:
 Or if you're sure you don't have any wide characters:

 auto rgszNamesStr = to!string(rgszNames[0][0 .. 
 wcslen(rgszNames[0])]);
to!string on a well-formed UTF-16 string is always safe. It will transcode to UTF-8.
Awesome. Sorry for the misinformation, I don't really know a lot about phobos w.r.t. unicode. There was some talk of an article on it by someone, but I don't remember seeing it happen.
Feb 11 2014