win64 DLL stdout printing after main process completes

cc cc at nevernet.com
Mon Apr 19 14:55:03 UTC 2021


I'm not sure if this is something unique to D or not, but I've 
having a minor issue where stdout output from a DLL (either via 
printf or phobos std.stdio write) is not displayed until after 
the main process has completed.  I'm making a project based 
around the example at https://wiki.dlang.org/Win32_DLLs_in_D 
which I've heard is a little out of date but I've gotten it 
working nonetheless.  I have the following project files:

```d
// mydll.d
module mydll;
import core.runtime;
import core.stdc.stdio;
import core.stdc.stdlib;
import core.sys.windows.windows;
extern(Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, 
LPVOID pvReserved) {
	switch (ulReason) {
		case DLL_PROCESS_ATTACH:
		printf("[dll] DLL_PROCESS_ATTACH\n");
		Runtime.initialize();
		break;
		case DLL_PROCESS_DETACH:
		printf("[dll] DLL_PROCESS_DETACH\n");
		Runtime.terminate();
		break;
		case DLL_THREAD_ATTACH:
		printf("[dll] DLL_THREAD_ATTACH\n");
		return false;
		case DLL_THREAD_DETACH:
		printf("[dll] DLL_THREAD_DETACH\n");
		return false;
		default:
	}
	return true;
}
export int MyDLL_Test() {
	printf("[dll] MyDLL_Test\n");
	return 5;
}
static this() {
	printf("[dll] static this for mydll\n");
}
static ~this() {
	printf("[dll] static ~this for mydll\n");
}
```

```d
// mydll.di
module mydll;
export int MyDLL_Test();
```

```d
// main.d
import mydll;
pragma(lib, "mydll.lib");
import core.sys.windows.windows;
void main() {
	printf("[Main] Start\n");
	scope(exit) printf("[Main] END\n");
	int x = MyDLL_Test();
	printf("[Main] x: %d\n", x);
	printf("[Main] Finished\n");
}
```

DLL compilation command line: `dmd -m64 -ofmydll.dll -L/DLL 
mydll.d mydll.def`
Main command line: `rdmd -m64 main.d`

And upon running, the output I receive is:
```
[Main] Start
[Main] x: 5
[Main] Finished
[Main] END
[dll] DLL_PROCESS_ATTACH
[dll] static this for mydll
[dll] MyDLL_Test
[dll] DLL_PROCESS_DETACH
[dll] static ~this for mydll
```

I would expect the first three lines of dll output to precede the 
"[Main] x:" line at least.  Is there something I'm doing wrong?  
Do I need to somehow pass a reference to the main stdio to the 
DLL's D runtime similar to how the GC can be shared?


More information about the Digitalmars-d-learn mailing list