描述:
我用ATL创建了一个ActiveX控件,用来在网页上使用,我想从ActiveX中获取一个字符串,但是调用失败。不知为什么,我添加方法是这样做的,是在VS2005下类视图中的IsfeEdit或键菜单中添加的方法,sfeEdit是类名
idl文件中自动加入 [id(1), helpstring("方法GetContent")] HRESULT GetContent([out,retval] BSTR* lpStr);
sfeEdit.h中加入 STDMETHOD(GetContent)(BSTR* lpStr);
sfeEdit.cpp中加入
STDMETHODIMP CCA::GetContent(BSTR* lpStr)
{
*lpStr = L"abc";
return S_OK;
}
在网页中调用的方法是:
<HTML>
<BODY>
<SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript>
Sub button1_onclick
Dim st1(1), st2
st2 = CA.GetContent
text1.value=str2
End Sub
</SCRIPT>
<INPUT id=button1 type=button value=Button name=button1>
<OBJECT ID="CA" CLASSID="CLSID:F85B5792-C78B-42CD-A1F9-8B024D046C84" width = 200 height=22 codebase="safeEdit.CAB">
</OBJECT>
<input id=text1 type=text name=text1 />
</BODY>
</HTML>
但是运行网页时出错,连网页都异常死了,请问高手在ATL ActiveX控件中怎么样传出字符串或别的数据。
另外一个最重要的是,在运行这个网页时需要部署,如果把该网页放到internet上怎么让网页自动下载该ActiveX控件并能运行,不出现ie阻止的对话窗口。
解决方案1:
*lpStr = L"abc";呵呵,一般的人在字符串分配上都容易犯的错,这一句绝对异常,因为输出的是另一个进程里的指针。进程间的内存是受保护的(除非是共享内存),否则非法异常。可以改为sprintf(lpstr,"abc")类似的方法
解决方案2: 不能等于常量,得分配内存。
解决方案3:
STDMETHODIMP CCA::GetContent(BSTR* lpStr)
{
*lpStr = SysAllocString(L"abc");
return S_OK;
}
看看我以前的整理
http://blog.csdn.net/wangweixing2000/archive/2007/11/19/1893602.aspx
www.codeproject.com/KB/COM/CompleteActiveX.aspx