IDispatch 的GetIDsOfNames方法出错问题(DISPID=-1)

codesnail 2009-01-13 03:18:51
最近因为项目需要在学习C++ 调用js,以下程序总是出现如题的错误,不能正确的得到DISPID,哪位大虾帮忙给看看
C/C++ codeHINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); 
char* queryAddress;
IDispatch *spScript;
DISPID dispid = NULL;
HRESULT hr;

queryAddress = "c:\\g.html";
m_gmap.Navigate(queryAddress,NULL,NULL,NULL,NULL);
CString str_fun_name = L"mod_list";

CComBSTR bstrMember(str_fun_name);
IHTMLDocument2 *spDoc =(IHTMLDocument2*)m_gmap.GetDocument();

hr =spDoc->get_Script(&spScript);
//这里出错了
if ( FAILED(hr) )
{
MessageBox("spScript error");
}
spScript->lpVtbl
hr = spScript->GetIDsOfNames(IID_NULL, &bstrMember,1,LOCALE_SYSTEM_DEFAULT, ispid);
//这里出错了:ispid =-1
if(FAILED(hr))
{
CString str_error;
str_error.Format("GetIDsOfNames 的dispid=%d",dispid);
MessageBox(str_error);
return;
}
.....





以下是html的代码

<html> 
<head>
<script>
function mod_list(class_name,str_text_orgi,str_text_current)
{
alert(class_name);
alert(str_text_orgi);
alert(str_text_current);
if(class_name=="app")
{

document.write("app"+str_text_orgi+"replease"+str_text_current+" <br/>");

}
else if(class_name=="ip")
{

document.write("ip"+str_text_orgi+"replease"+str_text_current+" <br/>");
}

}
</script>
</head>
<body>
aaaa
</body>
</html>



...全文
1039 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
computer7607 2012-05-25
  • 打赏
  • 举报
回复
高手快出来,帮忙解答一下吧!!!!
computer7607 2012-05-25
  • 打赏
  • 举报
回复
求人回答,等等等。。。。。
fighton 2012-01-17
  • 打赏
  • 举报
回复
遇到了同样的问题,毫无头绪啊
zzhhhnn 2009-12-07
  • 打赏
  • 举报
回复
哥们你这个问题最后怎么解决的啊?我也遇见了
做鸡真好吃 2009-01-14
  • 打赏
  • 举报
回复
mark~
codesnail 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wugaofeng555 的回复:]
检查一下&bstrMember中存放的字符串是否存在,bstrMember中存放的是 方法或者属性的名称,当GetIDsOfNames函数
找不到与bstrMember相对应的ID时,dispid就会返回-1.
[/Quote]
有道理,我也想过可是html的脚本函数名字也没有错阿,和bstrMember里的是一样的啊,郁闷啊!!!
wugaofeng555 2009-01-13
  • 打赏
  • 举报
回复
检查一下&bstrMember中存放的字符串是否存在,bstrMember中存放的是 方法或者属性的名称,当GetIDsOfNames函数
找不到与bstrMember相对应的ID时,dispid就会返回-1.
codesnail 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wugaofeng555 的回复:]
DISPID* dispid = NULL。
应该定义成指针呀。
[/Quote]
我做得没有错因为我调用的时候用的是
DISPID dispid = NULL。
hr = spScript->GetIDsOfNames(IID_NULL, &bstrMember,1,LOCALE_SYSTEM_DEFAULT, &dispid);
wugaofeng555 2009-01-13
  • 打赏
  • 举报
回复
DISPID* dispid = NULL。
应该定义成指针呀。
codesnail 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fairyprince 的回复:]
ispid 那来的?

定义
GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID *rgDispId)


DISPID dispid[x] = {0};
LPOLESTR rgszNames[] = {L"xxxx",L"\0"};

hr = spScript->GetIDsOfNames(IID_NULL, rgszNames,1,LOCALE_SYSTEM_DEFAULT, dispid);
[/Quote]
ispid 就是DISPID dispid = NULL的dispid,刚才试验了下问题没有解决仍然没有解决
fairyprince 2009-01-13
  • 打赏
  • 举报
回复
ispid 那来的?

定义
GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID *rgDispId)



DISPID dispid[x] = {0};
LPOLESTR rgszNames[] = {L"xxxx",L"\0"};

hr = spScript->GetIDsOfNames(IID_NULL, rgszNames,1,LOCALE_SYSTEM_DEFAULT, dispid);
codesnail 2009-01-13
  • 打赏
  • 举报
回复
哎呀,上面代码写错了个地方
第一个注释的地方*hr =spDoc->get_Script(&spScript); )没有错,第二个地方(GetIDsOfNames)出错了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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