digitalmars.D.bugs - dll bug
- Carlos Santander B. (63/63) Jun 09 2004 Is there a trick to create a DLL? Take these two files:
Is there a trick to create a DLL? Take these two files:
[bar.d]
import std.c.windows.windows, std.string;
extern(Windows)
alias int function () FOO;
int main() {
HINSTANCE dll = LoadLibraryA(toStringz("foo.dll"));
if (!dll) {
return -1;
}
FOO foo = cast(FOO) GetProcAddress(dll,"_foo 0");
if (!foo) {
return -1;
}
printf("1: aleat() = %d\n",foo());
printf("2: aleat() = %d\n",foo());
printf("3: aleat() = %d\n",foo());
FreeLibrary(dll);
return 0;
}
[foo.d]
import std.c.windows.windows;
HINSTANCE g_hInst;
extern (C)
{
void gc_init();
void gc_term();
void _minit();
void _moduleCtor();
void _moduleUnitTests();
}
extern (Windows):
export int f () {
static int a;
return a++;
}
BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
{
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
gc_init(); // initialize GC
_minit(); // initialize module list
_moduleCtor(); // run module constructors
_moduleUnitTests(); // run module unit tests
break;
case DLL_PROCESS_DETACH:
gc_term(); // shut down GC
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
// Multiple threads not supported yet
return false;
}
g_hInst=hInstance;
return true;
}
After I run bar, it doesn't print anything! Via debugging I found out that
there's an AV in the dll right when f is called.
If I do implib over the DLL, and link it with the program (instead of
dinamically loading the DLL), it works as expected. Any ideas?
-----------------------
Carlos Santander Bernal
Jun 09 2004








"Carlos Santander B." <carlos8294 msn.com>