DIP 1011 library alternative

IntegratedDimensions IntegratedDimensions at gmail.com
Thu May 17 06:58:06 UTC 2018


On Tuesday, 15 May 2018 at 21:25:05 UTC, Andrei Alexandrescu 
wrote:
> Hello, I was reviewing again DIP 1011 and investigated a 
> library solution. That led to
>
> https://gist.github.com/run-dlang/18845c9df3d73e45c945feaccfebfcdc
>
> It builds on the opening examples in:
>
> https://github.com/dlang/DIPs/blob/master/DIPs/DIP1011.md
>
> I'm displeased at two aspects of the implementation:
>
> * Perfect forwarding is tedious to implement: note that 
> makeDelegate hardcodes void as the return type and (int, float) 
> as parameter types. Ideally it should accept any parameters 
> that the alias passes.
>
> * Pass-by-alias and overloading interact poorly. Does anyone 
> know how to refer by alias to one specific overload?
>
>
> Thanks,
>
> Andrei

While you are at it, could you add a linkage type that lets one 
specify marshaled member function callbacks for interfacing with 
callbacks in windows API?

In many windows callbacks they require specifying a function 
pointer for a standard winapi function. The problem is that we 
cannot pass methods of objects  to windows functions wanting a 
callback since the methods use the calling convention of passing 
in object reference as the first parameter and expects that value 
to point to the object the method is acting in.

I have hacked together thunking using the standard methods to 
allow member functions but it is not pretty.

You can get more details of the problem here:

https://www.codeproject.com/Articles/16785/Thunking-in-Win-Simplifying-Callbacks-to-Non-sta


The idea would be to allow marking methods in a certain way which 
thunks them automatically for passing in to winapi callbacks 
almost as seamless as passing a static function.

It's a little tricky to do because the object reference as to be 
stored somewhere and retried correctly. In my hacked code I 
create a new function on the heap for each callback and store the 
object reference along side it. Inside the function it gets it's 
reference not from the hidden this parameter but from from the 
stored object value.

The real problem is the argument layout. Winapi will expect the 
first argument to be it's own but it stores the value in the 
object reference parameter. All these nuisances can be hidden by 
compiler magic.






More information about the Digitalmars-d mailing list