ATL控件(不用MFC),除CoClass之外,想把其他的自动化接口也添加到到ScriptEngine的NamedItem。
问题是: 我的GetItemInfo函数该怎么写才能支持多个自动化接口呢?怎么取得其他自动化接口的
UnKnow指针和TypeInfo指针?
问题是: 我的GetItemInfo函数该怎么写才能支持多个自动化接口呢?怎么取得其他自动化接口的
UnKnow指针和TypeInfo指针?
解决方案 »
- HOOK DirectDraw 后 如何画图写屏...
- 如何实现XTreme Toolkit中的报表控件CXTPReportControl鼠标单击列标题事件?
- _RecordsetPtr用完后要Release()吗?
- MFC规则 DLL 入口函数是什么
- !!!求助!!小弟急急急急急急!!
- 为什么CreateWaitableTimer()没有反应???
- 一个关于DirectPlay的问题!!快就命啦!!!
- 关于对话框输入的简单问题?
- ★★★快来抢100分★★★:textbox控件怎么不能用(没有焦点,不能输入)??
- 大虾,救人了。。。
- Project Settings修改会导致内存出错的一个问题.
- 关于类型库的疑问...
typedef std::map<std::string, CCmdTarget*, LessNoCase<std::string> > MAP_OBJECT;
class CServerScript : public CScriptEngine
{
public:
CServerScript();
virtual ~CServerScript();
virtual HRESULT OnGetItemInfo(
/* [in] */ LPCOLESTR pstrName,
/* [in] */ DWORD dwReturnMask,
/* [out]*/ IUnknown** ppUnknownItem,
/* [out]*/ ITypeInfo** ppTypeInfo); virtual void OnScriptErrorEx(long nLine, long nChar, LPCTSTR lpszSource, LPCTSTR lpszDecs); virtual HRESULT OnGetWindow(HWND* phWnd); void AddObject(LPCTSTR name, CCmdTarget* pObj);
BOOL RemoveObject(LPCTSTR name);
MAP_OBJECT m_mapObject;
};///////////////////////////////////////////////////////////////////////////////////void CServerScript::AddObject(LPCTSTR name, CCmdTarget* pObj)
{
ASSERT_VALID(pObj);
ASSERT_KINDOF(CCmdTarget, pObj);
m_mapObject[std::string(name)] = pObj;
}BOOL CServerScript::RemoveObject(LPCTSTR name)
{
MAP_OBJECT::iterator it = m_mapObject.find(name);
if(it == m_mapObject.end()) return FALSE;
m_mapObject.erase(it);
return TRUE;
}HRESULT CServerScript::OnGetItemInfo(LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown** ppUnknownItem, ITypeInfo** ppTypeInfo)
{
HRESULT hr = S_OK;
if(ppUnknownItem)
*ppUnknownItem = 0;
if(ppTypeInfo)
*ppTypeInfo = 0; USES_CONVERSION;
MAP_OBJECT::iterator it = m_mapObject.find(OLE2CA(pstrName));
if(it != m_mapObject.end())
{
CCmdTarget* pObject = it->second;
LPUNKNOWN pUnk = NULL;
if(pObject->IsKindOf(RUNTIME_CLASS(CCmdTargetPlug)))
pUnk = pObject->GetIDispatch(TRUE);
else if(pObject->IsKindOf(RUNTIME_CLASS(CWnd)))
pUnk = ((CWnd*)pObject)->GetControlUnknown();
else
pUnk = pObject->GetIDispatch(TRUE); ASSERT(pUnk != 0);
if(dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
*ppUnknownItem = pUnk;
pUnk->AddRef();
} if(dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
IProvideClassInfo *pci = NULL;
hr = pUnk->QueryInterface(IID_IProvideClassInfo, (void**)&pci);
if (SUCCEEDED(hr) && pci) {
hr = pci->GetClassInfo(ppTypeInfo);
pci->Release();
}
if (FAILED(hr))
{
pUnk->Release();
return E_FAIL;
}
} pUnk->Release();
}
else
{
hr = E_NOINTERFACE;
} return hr;
}
要创建一个支持 IDispatch 接口的对象
在 ODL 文件 中定义 其dispatch 接口.生成一个ATL 对象,支持双接口. 选择实现你定义
[
uuid(...) // 类的CLSID . 这些都是必需的
]
coclass MyObject
{
[default] interface IMyObject;
[default, source] interface IMyObjectEvent;
};