我在VBS里写的语句:
Set xmlHttp = CreateObject("Microsoft.XMLHttp")
xmlHttp.Open "GET","file:///e:/test.htm"
xmlHttp.Send
strInnerHTML = xmlHttp.ResponseText
Set htmlFile = CreateObject("HTMLFile")
htmlFile.Write strInnerHTML其中这个Write方法的声明是
[id(0x0000041e), vararg]
HRESULT write([in] SAFEARRAY(VARIANT) psarray);
而strInner显然是一个BSTR
VBScript里面运行当然是可以的,脚本解释器自行进行了转换
可是在C++里如何实现这个调用?
这个SAFEARRAY(VARIANT)类型声明是什么意思,是说这个安全数组是VT_SAFEARRAY吗,我就不知道传给Write方法是传VARIANT还是SAFEARRAY了
Set xmlHttp = CreateObject("Microsoft.XMLHttp")
xmlHttp.Open "GET","file:///e:/test.htm"
xmlHttp.Send
strInnerHTML = xmlHttp.ResponseText
Set htmlFile = CreateObject("HTMLFile")
htmlFile.Write strInnerHTML其中这个Write方法的声明是
[id(0x0000041e), vararg]
HRESULT write([in] SAFEARRAY(VARIANT) psarray);
而strInner显然是一个BSTR
VBScript里面运行当然是可以的,脚本解释器自行进行了转换
可是在C++里如何实现这个调用?
这个SAFEARRAY(VARIANT)类型声明是什么意思,是说这个安全数组是VT_SAFEARRAY吗,我就不知道传给Write方法是传VARIANT还是SAFEARRAY了
http://dev.csdn.net/htmls/44/44820.html
原来是SafeArray的指针封装在VARIANT变量中1.用函数SafeArrayCreateVector(VT_BSTR,0,LENGTH)创建下标为0、长度为LENGTH、元素为VT_BSTR型的安全数组,返回其指针
2.SafeArrayAccessData(&SafeArray,&pData)在pData中返回安全数组数据区指针
3.根据pData对数据区操作
4.封装在VARIANT结构中,vt = VT_SAFEARRAY
5.用函数SafeArrayDestroy(&SafeArray)销毁安全数组
昨天用错误的方法居然返回S_OK,我以为就行了,可能是个巧合。实际与脚本执行结果不一致。
今天再google了下,终于在老外的一个讨论版找到了答案:
http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/cdc68fd4-08d5-4bfd-8dd7-6c095bd619a6
IHTMLDocument2 *document; // Declared earlier in the code BSTR bstr = SysAllocString(OLESTR("Written by IHTMLDocument2::write().")); // Creates a new one-dimensional array
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
if (psaStrings == NULL) {
goto cleanup;
} VARIANT *param;
HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
param->vt = VT_BSTR;
param->bstrVal = bstr; hr = SafeArrayUnaccessData(psaStrings);
hr = document->write(psaStrings);cleanup:
// SafeArrayDestroy calls SysFreeString for each BSTR
if (psaStrings != NULL) {
SafeArrayDestroy(psaStrings);
}one thing that I don't understand is that the logic should be like:VARIANT *param;
param->vt = VT_BSTR;
param->bstrVal = bstr;HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
if (psaStrings == NULL) {
goto cleanup;
}