【问题标题】:How to pass string array from VBScript to COM+如何将字符串数组从 VBScript 传递到 COM+
【发布时间】:2017-10-20 21:05:16
【问题描述】:

我编写了一个作为 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) 

作为 COM+ 应用程序运行的 C++ 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;
    }

【问题讨论】:

标签: c++ vbscript


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2011-09-09
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2015-10-29
    相关资源
    最近更新 更多