如何从VBScript传递字符串数组到COM+?

3
我已经编写了一个作为COM+应用运行的C++ COM。 我正试图从VBScript(ASP应用程序)访问COM功能。 我能够从VBScript调用一个接受字符串的COM函数。但是当我尝试调用一个接受字符串数组的COM函数时,我能获取到数组的长度,但无法在COM端检索该数组的元素。
VBScript(ASP应用程序)
    dim myComObj
    Set myComObj = Server.CreateObject("ProgId_PerlCOMSimple.1")
    Dim myArray(3)
    myArray(0) = "Clean Underwear"
    myArray(1) = "Vacuum Cleaner"
    myArray(2) = "New Computer"
    myArray(3) = "Talking Bass"
    strDfStatus = myComObj.TestArray1 (myArray) 

C++ COM可以作为COM+应用程序运行(通过dllHost.exe)

    STDMETHODIMP CPerlCOMSimple::TestArray1(VARIANT* testArray, LONG* lResult)
    {
        // TODO: Add your implementation code here
        *lResult = testArray->parray->rgsabound->cElements;
        BSTR** StrPtr = 0;
        //LONG* pVals;
        long LowerBound = 0;
        long UpperBound = 0;
        int i;

        SafeArrayGetLBound(testArray->parray, 1, &LowerBound);
        SafeArrayGetUBound(testArray->parray, 1, &UpperBound);

        SafeArrayAccessData(testArray->parray, (void**)&pVals);

        for (i = LowerBound; i <= UpperBound; ++i)
        {
            BSTR* lVal = StrPtr[i];
            lVal++;
        }
        SafeArrayUnaccessData(testArray->parray);
        return S_OK;
    }

1
你测试过COM+方法的一个COM+方法吗? - aaronR
你想传递一个变量。你看过这里吗?https://dev59.com/vEXRa4cB1Zd3GeqPuspA - Jacob Bruinsma
1个回答

1
VBScript不会生成一个vartype为VT_BSTR的SAFEARRAY,这正是你期望的。它将具有VARTYPE VT_VARIANT。
// check all your parameters
if(testarray == null) return E_INVALIDARG;
if(testarray->vartype != VT_ARRAY|VT_BSTR
  && testarray->vartype != VT_ARRAY|VT_VARIANT)
    return E_INVALIDARG;
if(testarray->parray == null) return E_INVALIDARG;


// Now we have established we have an array, and that it
// is either a string array or a variant array.

VARTYPE vt = VT_EMPTY;
SafeArrayGetVarType(testarray->pArray, &vt);
// Now we need to take different actions based on the vartype.
if(vt == VT_BSTR){
    // we have an array of strings
    // Proceed as above.
}else if(vt == VT_VARIANT){
    // we have an array of variants, probably supplied by VBScript
    // Read them one by one and use VariantChangeType to get a string

}else{
    // We have some other array type we don't support
    return E_INVALIDARG;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接