my win32 program has been driving me nuts until I realized that the following code: /* --- console code --- */ import std.regexp; import std.stdio; void main() { auto r=search("abcdef","c"); writefln(r[0]); } /* --- end of console code --- */ outputs "c" on the console. but the following win32 equivalent: /* --- windows code --- */ import core.runtime; import std.regexp; import std.c.windows.windows; extern(Windows) void WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { void exceptionHandler(Throwable e) { throw e; } try { Runtime.initialize(&exceptionHandler); auto r=search("abcdef","c"); MessageBoxA(cast(HANDLE)0,cast(char*)r[0],"Alert",0); Runtime.terminate(&exceptionHandler); } catch(Object o) { MessageBoxA(cast(HANDLE)0,cast(LPSTR)o.toString(),"Alert",0); } } /* --- end of windows code --- */ results in "cdef"! also, the compiled win32 program - without the exception handling code - causes windows to crash.
Uh, no. Windows uses 0-terminated strings, D does not. All you're seeing when you output the result of the search with the message box is Windows stupidly reading until it hits a nul character (which, thankfully, D inserts at the end of string literals, or else you'd probably be getting a segfault here). You should be using toStringz to convert any D strings to C strings.