From: Mark M. <mie...@gm...> - 2009-08-24 22:41:53
|
I'm a little confused about how CSelf will work with mixin classes. (Right now I'm just using structs for the CSelf, in the future I intend to move to C++ classes.) Take this abbreviated example from ooDialog which uses mixin classes a lot. ::class 'WindowBase' public mixinclass object ::method init_windowBase external "LIBRARY oodialog wb_init_windowBase" ::attribute hwnd get external "LIBRARY oodialog wb_getHwnd" ::class 'PlainBaseDialog' public inherit WindowBase ResourceUtils ::class 'DialogControl' public inherit WindowBase WindowExtensions Since CSelf gets set as an object variable and since an object variable in WindowBase is not seen by DialogControl, (or PlainBaseDialog,) I though I would need separate CSelf structs for WindowBase and say DialogControl. So, the C++ code for an API implementation of init_WindowBase() looks something like this: RexxMethod1(logical_t, wb_init_windowBase, OSELF, self) { dbgPrintClassID(context, self); RexxBufferObject obj = context->NewBuffer(sizeof(CWindowBase)); pCWindowBase pcs = (pCWindowBase)context->BufferData(obj); // initialization ... context->SetObjectVariable("CSELF", obj); return 0; } My dbgPrint shows: Class: TestDialog When I sort of thought it would be WindowBase. TestDialog is actually a subclass of PlainBaseDialog. If I now go to set a different struct in DialogControl::init(): RexxMethod2(uint32_t, dlgctrl_init, OPTIONAL_POINTER, args, OSELF, self) { RexxBufferObject cdcBuf = c->NewBuffer(sizeof(CDialogControl)); // initialziation, etc. context->SetObjectVariable("CSELF", cdcBuf); // ... } My WindowBase code no longer works, for example: RexxMethod1(RexxStringObject, wb_getHwnd, CSELF, pCSelf) { return pointer2string(context, ((pCWindowBase)pCSelf)->hwnd); } Remember, wb_getHwnd is mapped to WindowBase::hwnd(). But pCSelf seems to now be a pointer to a CDialogControl struct, rather than a pointer to a CWindowBase struct. Is this perhaps a bug, or am I more than usually confused? -- Mark Miesfeld |