Struggling with wchar[] to string conversion

Jack jckj33 at gmail.com
Tue Jan 19 15:58:19 UTC 2021


On Tuesday, 19 January 2021 at 15:32:12 UTC, Stefan wrote:
> Hi,
>
> I am using dmd2.081.1 on windows building a 32 bit executable.
>
> I am trying to find out how many instances of the same program 
> are running. Therefor I use the core.sys.windows.tlhelp32 
> module.
>
> With the CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) and 
> Process32First/Process32Next I iterate over all processes and 
> for each process I iterate with 
> CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID) and 
> Module32First/Module32Next over all modules of a process.
> The Model32First/..Next fill a MODULEENTRY32 structure which 
> contains a szExePath member that is a wchar[260].
> Converting this to a string succeeds (compiler does not 
> complain) with
> me32.szExePath.text
> However, comparing this with the result of thisExePath() 
> (std.file) never succeeds although the two string values when 
> written with writeln() appear to be the same.
>
> This drives me crazy!
>
> Any ideas?
>
> Tschüß,
> Stefan

How are you trying to do such version? if member is of wchar[] 
get the .ptr and so that you have the memory pointer to operate 
with

import std.stdio;
import core.stdc.stddef : wchar_t;
import core.sys.windows.windows;

void main()
{
     wchar[MAX_PATH] buffer;
     GetModuleFileName(NULL, buffer.ptr, MAX_PATH);
     auto s = LPWSTRToDString(buffer.ptr);
     writeln(s);
}

// try-catch so that we can mark it as nothrow
string LPWSTRToDString(T)(T s) nothrow
if(is(T == LPWSTR) || is(T == wchar_t*) || is(T == const(wchar)*))
{
     import std.conv : to;
     import std.string : fromStringz;

     try {
           return to!(string)(s.fromStringz);
    } catch(Exception e) { // do your error-handling here
            return "";
    }
}


More information about the Digitalmars-d-learn mailing list