On Thursday, 13 November 2014 at 15:17:45 UTC, Adam D. Ruppe
wrote:
On Thursday, 13 November 2014 at 14:50:00 UTC, Wsdes wrote:
I am trying to write a wrapper for a C API in D. In C I have
the
following definition of a callback type:
typedef void (*Callback)(void*);
I would translate this directly to D:
extern(C) alias Callback = void function(void*);
Here the MyDtaCB function has no prototype but is defined as
follows:
void MyDtaCB(void* pVoid){
// Do stuff
}
And don't forget extern(C) on this too:
extern(C) void MyDtaCB(void* pVoid) {
}
And assign it to the struct:
Events.OnData = &MyDtaCB;
Unless you have a link to the wiki that talks about ints, maybe
that says something different, but I like to keep my C and D
code that calls it looking pretty much the same when I can.
Hi,
thank you everybody for your replies.
First of all, the link to the wiki that has an example of
callbacks in C and D:
http://dlang.org/interfaceToC.html
Secondly, I tried your code and that was exactly what I was
thinking and what I tried before. Then I thought I'd turn to the
wiki example, so that's where the int function came from. In the
meantime I changed that to return void so I gave you my old code
:(
Anyway, I think I got the problem solved. Well, there seems to
never have been any problem as I am taught now. I asked the
developer of the C API this morning if I should try to implement
the callback functions redundantly in D and he said he will have
a look with me later. So now it turns out that I cannot call the
extern callback function because it's not provided within the
library O.O I was already wondering why there are no prototypes
to these callback functions but I assumed they are provided from
another library that I don't have direct access to...
So the solution to my problem finally is to define the function
in my D file and then cast the function pointer to the Callback
type like this:
void MyDtaCB(void* v){
// Do stuff
}
Events.OnData = cast(Callback) &MyDtaCB;
At least this one compiles. Now I'm facing other problems with
struct members but I guess I'll figure this out. If not, I'll ask
again so stay tuned for some more unsolved mysteries ;)
Still, thank you all for your effort and time. Keep it up! :)