LPOLESTR* to string

John Colvin john.loughran.colvin at gmail.com
Mon Feb 10 09:54:13 PST 2014


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])]);


More information about the Digitalmars-d-learn mailing list