Binding win32 window to a D class
Serg Kovrov
kovrov at no.spam
Wed Aug 9 06:34:44 PDT 2006
Hello All,
This one should be beaten to death already, but still I do not aware of
fast/elegant way.
Maybe we could collect all possible solutions on that matter for D in
one place. Starting in this thread and hopefully move to a wiki page.
As I understand for D there even less available techniques then for C++.
In case of C++ I am aware of following:
1. using static method as window procedure and store pointer to class
instance in with SetWindowLongPtr. when dispatching messages retrieve
pointer to class with GetWindowLongPtr and call class method. This can't
be used in D since our pointer might become invalid as GC could swap /
compact memory. This is covered in "Garbage Collection" article -
http://digitalmars.com/d/garbage.html
2. Same as above, but stores class reference in static array/hash and
used SetWindowLongPtr/GetWindowLongPtr to store index to retrieve class
from that static array. This actually works for D. But it is most slow
technique since there we need to call GetWindowLongPtr and lookup for
class pointer/reference on every windows message.
3. So called thunking. A hack to store pointer to class method in
WNDCLASS.lpfnWndProc. Uses inline assembler substitute addresses at
runtime. Should be faster than other techniques since there is no need
to constantly call GetWindowLongPtr. Used in ATL/WTL. Could not be used
in D for same reason as first solution.
Thats seems all. The only available solution (from listed above) for D
is #2.
I hope there is other methods to solve this problem, and perhaps there
are completely different approaches to organize win32 window management,
and I'd like to discuss them here.
Thanks
--
serg.
More information about the Digitalmars-d-dwt
mailing list