D - More DLL questions
- Matthew Wilson (23/23) Mar 14 2003 I'm wondering about the feasibility of creating small tight DLLs in D, a...
- Burton Radons (40/40) Mar 14 2003 Here's what I have. The .d file is:
- Deja Augustine (7/7) Mar 15 2003 I may have missed it in the docs, but is there any way to redirect the p...
- Matthew Wilson (8/48) Mar 15 2003 Thanks Burton.
I'm wondering about the feasibility of creating small tight DLLs in D, and am a bit surprised that a do-nothing DLL is 64KB. I've messed around and basically wonder why the following, when compiled and linked, doesn't form a recognisable Win32 DLL (regsvr32.exe complains miserably). import windows; extern(Windows) BOOL DllMain(HINSTANCE hinst, ULONG reason, LPVOID reserved) { return true; } extern(Windows) uint DllRegisterServer() { return 0; } Any explanation gratefully received. When I put in a call to gc_init on process-attach, it registers fine, not to mention creating a Win32 DLL that is recognisable by the OS. I'm interested in creating function only DLLs, and where no GC is required I don't want to link in 60+KB. Any chance of this? Thanks (and apologies if any of these questions are dumb or repeating well-discussed issues covered in the last six months) Matthew
Mar 14 2003
Here's what I have. The .d file is: import windows; extern(C) uint _acrtused_dll = (uint) &DllMain; extern(Windows) BOOL DllMain(HINSTANCE hinst, ULONG reason, LPVOID reserved) { return true; } extern(Windows) uint DllRegisterServer() { return 0; } extern(C) int foobar() { return 450; } The .def file is: LIBRARY dll DESCRIPTION 'BLAH BLAH' EXETYPE NT CODE PRELOAD DISCARDABLE DATA PRELOAD SINGLE EXPORTS DllMain foobar And the test file is: import windows; extern(C) int function() foobar; int main() { HANDLE library = LoadLibraryA("dll.dll"); printf("Library %d\n", library); *(void**) &foobar = GetProcAddress(library, "foobar"); printf("calling\n"); int result = foobar(); printf("done %d\n", result); return 0; } The DLL produced is 3,100 bytes, and appears to be working properly.
Mar 14 2003
I may have missed it in the docs, but is there any way to redirect the path that the .dll is written to? For .exe files you can do: D:\dmd\bin>dmd.exe d:\input\codefile.d d:\output\executable.exe and it'll write the executable to the path given. I haven't been able to figure out how to redirect .dlls. -Deja
Mar 15 2003
Thanks Burton. From your example, it seems that the only thing I needed to what I had was the __acrtused_dll decl/assignment. Obviously this is needed by the compiler or the linker to ensure that the image is generated correctly. 3100 bytes; happy me. :) Matthew "Burton Radons" <loth users.sourceforge.net> wrote in message news:b4um9s$106m$1 digitaldaemon.com...Here's what I have. The .d file is: import windows; extern(C) uint _acrtused_dll = (uint) &DllMain; extern(Windows) BOOL DllMain(HINSTANCE hinst, ULONG reason, LPVOID reserved) { return true; } extern(Windows) uint DllRegisterServer() { return 0; } extern(C) int foobar() { return 450; } The .def file is: LIBRARY dll DESCRIPTION 'BLAH BLAH' EXETYPE NT CODE PRELOAD DISCARDABLE DATA PRELOAD SINGLE EXPORTS DllMain foobar And the test file is: import windows; extern(C) int function() foobar; int main() { HANDLE library = LoadLibraryA("dll.dll"); printf("Library %d\n", library); *(void**) &foobar = GetProcAddress(library, "foobar"); printf("calling\n"); int result = foobar(); printf("done %d\n", result); return 0; } The DLL produced is 3,100 bytes, and appears to be working properly.
Mar 15 2003