^IDispatch en AMS

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Siguiendo el tema de los stdFont , hace poco me encontre tambien con este problem a la hora de traducir con luacom ^IDispatch , esto creo que se refiere a objetos en VB ( botones y demas) me imagino que no sera facil pero se os ocurre algun sistema para aplicar esto en objetos de AMS mediante luacom, la funcion en cuestion es esta :
function MakeToolTip(out ownerControl: ^IDispatch; sText: BSTR; out sTitleText: BSTR; out eStyle: eToolTipStyle; out eIcon: eToolTipIcon; out bCentered: Bool; out cForeColor: I4; out cBackColor: I4; out lHoverTime: I4; out lPopupTime: I4; out bR2L: Bool); stdcall;
Todo objeto luacom creado con createobject en lua hace referencia a tLuaCom y fuera de el, hace referencia al IDispatch, osea que si por ejemplo has creado un control por ejemplo owner=luacom.createobject(...) deberias poder pasar owner como string idispatch, ya que no es un string sino que es realmente este tipo de objeto, solo que en lua esta camuflado porque en realidad se controla mediante un sistema de fake variables que usa luacom.

Por cierto que luacom en si mismo, no es que digamos que pyuede controlar de todo, tiene solamente un 40 o 50% de las opciones del COM portadas y usa metodos muy oscuros para hacerlo funcionar.

Mi recomendacion mas prudente a la hora de usar activex en un proyecto es siempre crear una clase de compatibilidad con classwizard en visual studio y crearle un propio object plugin o action plugin, segun si es windowed o no, en el que todo el interfaz lua esta escrito sin luacom.

Solo asi podemos conseguir una integracion 100% util

Si os interesa el tema os preparo un ejemplo basico y os subo el codigo, es algo mas de trabajo a la hora de crear la integración pero el resultado es veloz y rapido y totalmente fuera de wrappers y historias que no hacen mas que joder.
Por ejemplo, para el tss ballon tip

// Machine generated IDispatch wrapper class(es) created with Add Class from Typelib Wizard

#import "C:\\Users\\Pabloko\\Documents\\AutoPlay Media Studio 8\\Projects\\tooltip\\CD_Root\\tssBalloonTip2Demo.dll" no_namespace
// CBalloonTip wrapper class

class CBalloonTip : public COleDispatchDriver
{
public:
CBalloonTip(){} // Calls COleDispatchDriver default constructor
CBalloonTip(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
CBalloonTip(const CBalloonTip& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

// Attributes
public:

// Operations
public:


// _BalloonTip methods
public:
unsigned long get_BackColor()
{
unsigned long result;
InvokeHelper(0x6803000d, DISPATCH_PROPERTYGET, VT_UI4, (void*)&result, NULL);
return result;
}
void put_BackColor(unsigned long newValue)
{
static BYTE parms[] = VTS_UI4 ;
InvokeHelper(0x6803000d, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
unsigned long get_ForeColor()
{
unsigned long result;
InvokeHelper(0x6803000c, DISPATCH_PROPERTYGET, VT_UI4, (void*)&result, NULL);
return result;
}
void put_ForeColor(unsigned long newValue)
{
static BYTE parms[] = VTS_UI4 ;
InvokeHelper(0x6803000c, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_HoverTime()
{
long result;
InvokeHelper(0x6803000b, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_HoverTime(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x6803000b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_PopupTime()
{
long result;
InvokeHelper(0x6803000a, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_PopupTime(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x6803000a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_Centered()
{
BOOL result;
InvokeHelper(0x68030009, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Centered(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x68030009, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Style()
{
long result;
InvokeHelper(0x68030008, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_Style(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x68030008, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Icon()
{
long result;
InvokeHelper(0x68030007, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_Icon(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x68030007, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_RightToLeft()
{
BOOL result;
InvokeHelper(0x68030006, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_RightToLeft(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x68030006, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
CString get_Text()
{
CString result;
InvokeHelper(0x68030005, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
void put_Text(LPCTSTR newValue)
{
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x68030005, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
CString get_Title()
{
CString result;
InvokeHelper(0x68030004, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
void put_Title(LPCTSTR newValue)
{
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x68030004, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_UseCustomFont()
{
BOOL result;
InvokeHelper(0x68030003, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_UseCustomFont(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x68030003, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
LPDISPATCH get_Font()
{
LPDISPATCH result;
InvokeHelper(0x68030002, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
void putref_Font(LPDISPATCH * newValue)
{
static BYTE parms[] = VTS_PDISPATCH ;
InvokeHelper(0x68030002, DISPATCH_PROPERTYPUTREF, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_ShowShadow()
{
BOOL result;
InvokeHelper(0x68030001, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_ShowShadow(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x68030001, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Transparency()
{
long result;
InvokeHelper(0x68030000, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_Transparency(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x68030000, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
void MakeToolTipByHwnd(long lHWnd, LPCTSTR sText, LPCTSTR sTitleText, long eStyle, long eIcon, BOOL bCentered, long cForeColor, long cBackColor, long lHoverTime, long lPopupTime, BOOL bR2L)
{
static BYTE parms[] = VTS_I4 VTS_BSTR VTS_BSTR VTS_I4 VTS_I4 VTS_BOOL VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_BOOL ;
InvokeHelper(0x6003000f, DISPATCH_METHOD, VT_EMPTY, NULL, parms, lHWnd, sText, sTitleText, eStyle, eIcon, bCentered, cForeColor, cBackColor, lHoverTime, lPopupTime, bR2L);
}
void MakeToolTip(LPDISPATCH * ownerControl, LPCTSTR sText, LPCTSTR sTitleText, long eStyle, long eIcon, BOOL bCentered, long cForeColor, long cBackColor, long lHoverTime, long lPopupTime, BOOL bR2L)
{
static BYTE parms[] = VTS_PDISPATCH VTS_BSTR VTS_BSTR VTS_I4 VTS_I4 VTS_BOOL VTS_I4 VTS_I4 VTS_I4 VTS_I4 VTS_BOOL ;
InvokeHelper(0x60030010, DISPATCH_METHOD, VT_EMPTY, NULL, parms, ownerControl, sText, sTitleText, eStyle, eIcon, bCentered, cForeColor, cBackColor, lHoverTime, lPopupTime, bR2L);
}
void ShowBalloonTip(long * xPos, long * yPos, BOOL * bIsScreenCoords)
{
static BYTE parms[] = VTS_PI4 VTS_PI4 VTS_PBOOL ;
InvokeHelper(0x60030013, DISPATCH_METHOD, VT_EMPTY, NULL, parms, xPos, yPos, bIsScreenCoords);
}
void HideBalloonTip()
{
InvokeHelper(0x60030014, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

// _BalloonTip properties
public:

};


Esta clase se podria crear usando obj= new CBalloonTip; obj->function(...) ya que sus funciones son portadas a c++ y sus propiedades se han añadido como funciones con los prefijos get_ o set_

Luego simplemente habria que crear cada funcion en lua creando todas las funciones exportadas y nuevas para las propiedades y usando el api del objeto, en este caso seria pObject->obj->Function(...)

parece complejo pero os puedo enseñar y seguro que lo veis facil facil, y podeis usar toda la potencia de com con ams

Ademas seria posible crear un script que cree automaticamente el codiido c++ para lua usando este archivo de cabecera, ya que todas las definiciones estan perfectamente definidas y usadas
Gracias por la aclaración pablo , yo por mi parte estoy muy interesado en el ejemplo que comentas.
YEAH!!!