Am I doing it wrong or is this a bug ?

Don nospam at nospam.com
Thu Aug 12 01:35:19 PDT 2010


Ezneh wrote:
> Hello !
> 
> I'm doing some tests with the DLL example which is in the samples directory but I have some problem with it.
> 
> 
> Well, when I'm compiling the DLL with that files, I got no error and it works in the test.d sample but doesn't work in another project (in another language) :
> 
> //mydll.d
> module mydll;
> import std.c.stdio;
> 
> export string dllprint() { return "hello"; }
> 
> 
> //dll.d
> 
> import std.c.windows.windows;
> import core.dll_helper;
> 
> __gshared HINSTANCE g_hInst;
> 
> extern (Windows)
> BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
> {
>     switch (ulReason)
>     {
> 	case DLL_PROCESS_ATTACH:
> 	    g_hInst = hInstance;
> 	    dll_process_attach( hInstance, true );
> 	    break;
> 
> 	case DLL_PROCESS_DETACH:
> 	    dll_process_detach( hInstance, true );
> 	    break;
> 
> 	case DLL_THREAD_ATTACH:
> 	    dll_thread_attach( true, true );
> 	    break;
> 
> 	case DLL_THREAD_DETACH:
> 	    dll_thread_detach( true, true );
> 	    break;
>     }
>     return true;
> }
> 
> // .def file
> LIBRARY "mydll.dll"
> EXETYPE NT
> SUBSYSTEM WINDOWS
> CODE SHARED EXECUTE
> DATA WRITE
> 
> // test.d
> import mydll;
> import std.stdio;
> 
> int main(string args[])
> {
>    writeln(mydll.dllprint());
>    return 0;
> }
> 
> 
> With all theses files, test.exe works well.
> 
> But when I want to use it with another programming language, I got this error :
> 
> "Cannot find the entry point for 'dllprint' in 'mydll.dll'
> 
> 
> So, I tried to change the .def file like this :
> 
> LIBRARY "mydll.dll"
> EXETYPE NT
> SUBSYSTEM WINDOWS
> CODE SHARED EXECUTE
> DATA WRITE
> EXPORTS
> 	dllprint
> 
> but I got this error :
> 
> D:\D\dmd\samples\d\mydll>dmd -ofmydll.dll -L/IMPLIB mydll.d dll.d mydll.def
> OPTLINK (R) for Win32  Release 8.00.2
> Copyright (C) Digital Mars 1989-2009  All rights reserved.
> http://www.digitalmars.com/ctg/optlink.html
> OPTLINK : Error 180: No Match Found for Export/ENTRY -  : dllprint
> OPTLINK : Error 81: Cannot EXPORT : dllprint
> 
> 
> So what I'm doing wrong ? Is this a bug from optlink ?
You need to make dllprint an extern(C) function. If you just mark it as 
'extern', it uses D name mangling, which the other language won't 
understand.


More information about the Digitalmars-d mailing list