On 13.02.2012 20:13, Walter Bright wrote:
Hi Alf! Welcome!

Thanks.


On 2/12/2012 4:02 PM, Alf P. Steinbach wrote:
[snip]

* Improvement potential #5 -- The description of Windows prog.

Following main site's links to
[http://d-programming-language.org/windows.html],
I found a real monstrosity as an example of purportedly simplest possible
Windows GUI program. It's almost funny. Here is mine:

<code>
import std.c.windows.windows;

void main()
{
    MessageBoxW( null, "Text", "Caption", MB_OK | MB_ICONINFORMATION );
}
</code>

[Just in passing, a practical tip: in Thunderbird (which you're using), selecting all the text before hitting "Reply" prevents TB from removing indents from code. They added the remove-indents behavior in version 2. Nobody expects it, for why on Earth should it do that?, but it does.]


And here is how I built it:


<example>
[d:\dev\test\d]
> dmd minimal_gui.d -L-subsystem:windows

[d:\dev\test\d]
> dumpbin /headers minimal_gui.exe | find /i "sub"
3.10 subsystem version
2 subsystem (Windows GUI)

[d:\dev\test\d]
> minimal.d
</example>


Maybe with DMD tools something potentially bad happens here. However,
with
extant C++ compilers (and even old Borland C++ 5.5) this way of doing
things
works splendidly. So here is a definite improvement potential for the
web site
page with the monstrous code, and if the current tools don't handle it
well,
also for the the toolset. :-)

Good point, the Windows examples get less love than the other stuff.

He he.


On
the other hand, I don't think a simple main()/MessageBoxW() program
scales as a first program. It needs to be a WinMain(), and it needs to
show how to get a classic GUI program started up and shut down. The user
can then start hanging flesh on it for his own purposes.

Oh, that's just Microsoft propaganda-by-example.

In C and C++ the non-standard Microsoft specific WinMain startup function technically only makes the programs formally incorrect for a hosted implementation, and in practice it serves to make people accept also other Microsoft lock-in things blindly, without questioning.

People are tricked into believing that this Microsoft standard-breaking thing is needed because all Microsoft examples use it, and because Microsoft's toolchain (but not e.g. the GNU toolchain) won't accept a standard `main` for a GUI subsystem program, without use of not very well documented options (MSVC linker option "/entry:mainCRTStartup").

In D, if the example code given on the D site is correct apart from the result value bug, WinMain requires a lot of ugly boiler-plate code. Re the bug, it's duplicated in the VisualD starter code for a new console project, so such boiler-plate code is definitely undesirable... So, on the Bright side, this is a real improvement opportunity :-).

The main problem (pun not intended) in C and C++ is that neither standard `main` nor non-standard Microsoft `WinMain` provide the command line arguments in Unicode. Standard `main` has `char` arguments, by Windows convention encoded in Windows ANSI, which generally means data loss and e.g. that some file names can't be passed. Microsoft `WinMain` provides the arguments part of the command line, in Unicode, but not split up into individual arguments.

I do not yet know the valid signatures for a D standard `main`.

But if those D signatures include one with a set of Unicode arguments, then all is super-duper, and if not, then one must just do in D what one must do in C and C++ for a real and standard-conforming program, namely to use the Windows API to retrieve the arguments (if necessary).


- Alf (at very beginning of checking out the D language)

Thanks for taking the time to post these first experiences. It's often
hard for use to see the picture in the way a new user does.

I once, as a college lecturer, used to quip that one learns as long as one has students... ;-)


Cheers & hth.,

- Alf

Reply via email to