Aaaand figured it out: actually, the fact it worked on Vista but not on XP was the key clue and I'm ashamed I didn't realize this earlier.

This comment hints at it too in dserver.d
            // Multiple threads not supported yet


Anyway, D's thread local storage doesn't quite work right on Windows XP, and does work beautifully on Vista and up. I don't really know why, but that's the way it is. It can cause invalid memory accesses...

....And the GUIDs and a couple other variables in the sample are thread local! (Back when the sample was written, global variables were truly global, like in C. Since then, that's changed, the variables are now in thread local storage unless you mark them with __gshared, which breaks things...)

So here's the fix: add __gshared to a few places.

dserver.d, line 119 give or take, there's some globals g_cObj etc:

__gshared ULONG g_cObj =0;
__gshared ULONG g_cLock=0;

__gshared HINSTANCE g_hInst;

chello.d, about line 24:


__gshared GUID CLSID_Hello = { 0x30421140, 0, 0, [0xC0, 0, 0, 0, 0, 0, 0, 0x46] }; __gshared GUID IID_IHello = { 0x00421140, 0, 0, [0xC0, 0, 0, 0, 0, 0, 0, 0x46] };


(Actually, those could probably be immutable too, but meh just making it work.)


Then recompile, remembering the libraries we talked about on stack overflow, and you get a new dll. On my computer, it actually came out 100KB smaller too, cool!


Now, chello.exe runs and successfully creates the object.

regsvr32.exe still fails though, on XP (works on Vista), I must still be missing something. But this is a lot closer already....

Reply via email to