Thread overview
More DLL questions
Mar 15, 2003
Matthew Wilson
Mar 15, 2003
Burton Radons
Yet Another DLL Question
Mar 15, 2003
Deja Augustine
Mar 16, 2003
Matthew Wilson
March 15, 2003
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



March 15, 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.

March 15, 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



March 16, 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.
>