我在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了

解决方案 »

  1.   

    OK  - -      自己又给自己结帖了,老是这样。
    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)销毁安全数组
      

  2.   

    我发现我昨天匆匆的搞错了,[in] SAFEARRAY(VARIANT) psarray的意思是传入一个安全数组指针参数,这个安全数组的元素是VT_VARIANT型,然后这个VARIANT元素是VT_BSTR
    昨天用错误的方法居然返回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*)&param);
      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*)&param);
    if (psaStrings == NULL) {
        goto cleanup;
      }
      

  3.   

    this is a lock and unlock.