converting D's string to use with C API with unicode

Виталий Фадеев vital.fadeev at gmail.com
Sun Dec 6 04:41:56 UTC 2020


On Saturday, 5 December 2020 at 19:51:14 UTC, Jack wrote:
> So in D I have a struct like this:
>
>>struct ProcessResult
>>{
>>	string[] output;
>>	bool ok;
>>}
>
> in order to use output from C WINAPI with unicode, I need to 
> convert each string to wchar* so that i can acess it from C 
> with wchar_t*. Is that right or am I missing anything?
>
>
>>struct ProcessResult
>>{
>>	string[] output;
>>	bool ok;
>>
>>	C_ProcessResult toCResult()
>>	{
>>		auto r = C_ProcessResult();
>>		r.ok = this.ok; // just copy, no conversion needed
>>		foreach(s; this.output)
>>			r.output ~= cast(wchar*)s.ptr;
>>		return r;
>>	}
>>}
>
>>version(Windows) extern(C) export
>>struct C_ProcessResult
>>{
>>	wchar*[] output;
>>	bool ok;
>>}

Drawing string via WinAPI. As example.

// UTF-16. wchar*
wstring ws = "Abc"w;
ExtTextOutW( hdc, x, y, 0, &clipRect, cast( LPCWSTR ) ws.ptr, 
cast( uint ) ws.length, NULL );

// UTF-8. char*
string s = "Abc";
import std.utf : toUTF16;
string ws = s.toUTF16;
ExtTextOutW( hdc, x, y, 0, &clipRect, cast( LPCWSTR ) ws.ptr, 
cast( uint ) ws.length, NULL );

// UTF-32. dchar*
dstring ds = "Abc"d;
import std.utf : toUTF16;
string ws = ds.toUTF16;
ExtTextOutW( hdc, x, y, 0, &clipRect, cast( LPCWSTR ) ws.ptr, 
cast( uint ) ws.length, NULL );

One char.
// UTF-16. wchar
wchar wc = 'A';
ExtTextOutW( hdc, x, y, 0, &clipRect, cast( LPCWSTR ) &wc, 1, 
NULL );

// UTF-32. dchar
dchar dc = 'A';
import std.utf : encode;
wchar[ 2 ] ws;
auto l = encode( ws, dc );
ExtTextOutW( hdc, x, y, 0, &clipRect, cast( LPCWSTR ) &ws.ptr, 
cast( uint ) l, NULL );

//
// Font API
string face = "Arial";
LOGFONT lf;
import std.utf : toUTF16;
lf.lfFaceName[ 0 .. face.length ] = face.toUTF16;
HFONT hfont = CreateFontIndirect( &lf );

// Common case
LPWSTR toLPWSTR( string s ) nothrow // wchar_t*. UTF-16
{
     import std.utf : toUTFz, toUTF16z, UTFException;
     try                        { return toUTFz!( LPWSTR )( s ); }
     catch ( UTFException e )   { return cast( LPWSTR ) 
"ERR"w.ptr; }
     catch ( Exception e )      { return cast( LPWSTR ) 
"ERR"w.ptr; }
}
alias toLPWSTR toPWSTR;
alias toLPWSTR toLPOLESTR;
alias toLPWSTR toPOLESTR;

// WinAPI
string windowName = "Abc";
HWND hwnd =
     CreateWindowEx(
         ...
         windowName.toLPWSTR,
         ...
     );




More information about the Digitalmars-d-learn mailing list