求代码,牛牛进~~~

fj182 2007-07-31 11:31:49
1、访问IDispatch接口的Invoke方法,实现类似于CallByName的功能。要求支持引用参数,且效率高。
2、通过访问IDispatch接口获得任意对象的类型库信息。

以上要求不能使用TypeInfoLib,我用的是 Edanmo's OLE interfaces(http://www.mvps.org/emorcillo/download/vb6/tl_ole.zip),因为本人对COM底层不了解,故求大家帮忙。
...全文
332 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
fj182 2007-08-13
  • 打赏
  • 举报
回复
哎,又没戏了
VirtualDesktop 2007-08-08
  • 打赏
  • 举报
回复
不会呀...........................
WM_JAWIN 2007-08-08
  • 打赏
  • 举报
回复
呵,楼上都是牛人哪!好多星星在上面闪呀~~
kmlxk0 2007-08-08
  • 打赏
  • 举报
回复
高科技啊高科技......
fj182 2007-08-07
  • 打赏
  • 举报
回复
唉!都不知道该如何揭帖了。
嗷嗷叫的老马 2007-08-01
  • 打赏
  • 举报
回复
我要蹭分~~~~~~~~~~~~~~~~
fj182 2007-08-01
  • 打赏
  • 举报
回复
这段代码来自ms's DispInvoker
fj182 2007-08-01
  • 打赏
  • 举报
回复
其中第一个问题就是这段代码转成VB的。
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid)
{
//TODO
// add "call" function to object methods
// use DISPID_EVALUATE for this method

// if the first string id "call" then DISPID_EVALUATE
// pass rgszNames+1 to object

HRESULT hr(S_OK);

if (_bstr_t(rgszNames[0]) == _bstr_t("Call")){

// rgszNames doesn't contain the function name you need
// because it is passed a parameter value
// named arguments may not be resolved when used with Call() function

// just answer DISPID_EVALUATE for Call method ...
rgdispid[0]=DISPID_EVALUATE;
for (UINT i(1);i<cNames;i++) {
rgdispid[i]=DISPID_UNKNOWN;
}

if (cNames>1)
return DISP_E_UNKNOWNNAME;
else
return S_OK;

}
else {

return m_pDisp->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);

}

}

STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
//TODO
// also, add ISupportErrorInfo to the contained dispatch

if (wFlags & DISPATCH_METHOD && dispidMember==DISPID_EVALUATE) {
// call() function is being called ...
// NW: the function name may not be passed as a named parameter
// Call() doesn't work for puting properties ...
// ... the value should be passed as a named argument with DISPID_EVALUATE

// find out dispidMember
HRESULT hr(S_OK);
// last element in rgvarg contains the first argument (i.e. the method name)
_bstr_t sMember = _variant_t(pdispparams->rgvarg[pdispparams->cArgs-1]);
BSTR bstrMember = sMember;

hr = m_pDisp->GetIDsOfNames(riid,&bstrMember, 1, lcid, &dispidMember);

//lower cArgs by 1
pdispparams->cArgs--;
return m_pDisp->Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);

} else {

// otherwise, behave as usual ...
return m_pDisp->Invoke(dispidMember, riid, lcid, wFlags, pdispparams,
pvarResult, pexcepinfo, puArgErr);
}
}
fj182 2007-08-01
  • 打赏
  • 举报
回复
唉!冷冷清清,凄凄惨惨戚戚。
vbman2003 2007-08-01
  • 打赏
  • 举报
回复
不懂哎,只能帮顶
嗷嗷叫的老马 2007-08-01
  • 打赏
  • 举报
回复
............帮顶

等版主们来看看吧
fj182 2007-08-01
  • 打赏
  • 举报
回复
晕,自己顶
fj182 2007-07-31
  • 打赏
  • 举报
回复
多谢楼上兄弟支持,不过这个代码我也看过,不支持ByRef。
VirtualDesktop 2007-07-31
  • 打赏
  • 举报
回复
http://www.mvps.org/emorcillo/en/code/vb6/index.shtml
VirtualDesktop 2007-07-31
  • 打赏
  • 举报
回复
http://www.mvps.org/emorcillo/download/vb6/invoke.zip
fj182 2007-07-31
  • 打赏
  • 举报
回复
不会吧?偶的人品没有问题呀,咋只有人学没有人教呢?
yachong 2007-07-31
  • 打赏
  • 举报
回复
搬个板凳学习
vbman2003 2007-07-31
  • 打赏
  • 举报
回复
我是猪猪
帮顶学习
^_^
zzyong00 2007-07-31
  • 打赏
  • 举报
回复
只能帮顶了
fj182 2007-07-31
  • 打赏
  • 举报
回复
分不够在加啊,我从来都不吝啬的,别让帖子沉了。
加载更多回复(1)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧