February 06, 2002
It seems that D function pointers always have the D calling convention. Try:

    import c.stdio;

    extern(Windows) void (*func)(int, int, int);

    extern(Windows) void foo(int a, int b, int c)
    {
     printf("%d %d %d\n", a, b, c);
    }

    int main()
    {
     func = &foo;
     (*func)(1, 2, 3);
     return 0;
    }

Pointers to stdcall functions are needed, however, for LoadLibrary/ GetProcAddress way to use DLLs. They're also used in TinyPTC.

BTW it took me about 5 hours (!) to figure this out. I just couldn't get why the same code works in C but fails in D. Stack dumps, printfs all around the code... till I finally disassembled both OBJs and looked at the code there =)


February 07, 2002
You're right. I'll have that fixed in the next update. -Walter

"Pavel Minayev" <evilone@omen.ru> wrote in message news:a3r52s$29gs$1@digitaldaemon.com...
> It seems that D function pointers always have the D calling convention. Try:
>
>     import c.stdio;
>
>     extern(Windows) void (*func)(int, int, int);
>
>     extern(Windows) void foo(int a, int b, int c)
>     {
>      printf("%d %d %d\n", a, b, c);
>     }
>
>     int main()
>     {
>      func = &foo;
>      (*func)(1, 2, 3);
>      return 0;
>     }
>
> Pointers to stdcall functions are needed, however, for LoadLibrary/ GetProcAddress way to use DLLs. They're also used in TinyPTC.
>
> BTW it took me about 5 hours (!) to figure this out. I just couldn't get why the same code works in C but fails in D. Stack dumps, printfs all around the code... till I finally disassembled both OBJs and looked at the code there =)
>
>