c++ - 如何将 double 组从 VB6 传递到 VC++..这段代码有什么问题?

标签 c++ vb6

如何将 double 组从 VB6 传递到 VC++..这段代码有什么问题?

VB 代码: dSelfCdArr 是我的 double 组

Public Sub FilterDocTypeByPriv(colEventSets As Collection)

Dim lCount As Long
Dim oColItem As Object
Dim objDBEventSetRow As DB_EventSetRow
Dim evYes As Boolean
Dim dSelfCdArr() As Double
For lCount = 1 To colEventSets.Count
    Set objDBEventSetRow = colEventSets(lCount)
    ReDim Preserve dSelfCdArr(1 To lCount)
    dSelfCdArr(lCount) = CDbl(objDBEventSetRow.dSelf_cd)
Next

Call m_dtsAppForm.DocController.HasPrivCreateResultEventCode(m_dUserId, m_dPositionCd, m_dPPRCd, dSelfCdArr)
End Sub

C++ Idl 文件:

[id(51), helpstring("method HasPrivCreateResultEventCode")] HRESULT HasPrivCreateResultEventCode([in]double dUserId,[in]double dPosCd,[in]double dPPRCd, [in, out] VARIANT* pEventCode); 

C++ 代码:我在 VARIANT* pEventCode 的第一行中得到错误的指针

STDMETHODIMP CDocumentController::HasPrivCreateResultEventCode(double dUserId,double dPosCd,double dPPRCd, VARIANT* pEventCode)
{   

HRESULT hr = E_FAIL;
AFX_MANAGE_STATE(AfxGetStaticModuleState())

if (V_VT(pEventCode) == VT_ARRAY | VT_R8)
{
    CComSafeArray<double> arrECode;

    arrECode.Attach(pEventCode->parray);

    double pVals;

    int iCount = arrECode.GetCount();

    CMap<double,double,bool,bool> mapEventCds;

    for(int iIndex = 0; iIndex < iCount; iIndex++)
    {                              
        double pVals = arrECode.GetAt(iIndex);

        mapEventCds.SetAt(pVals, false);

        std::cout << "element " << iIndex << ": value = " << pVals << std::endl;
    }

    CheckPrivViewResultEventCds(dUserId, dPosCd, dPPRCd, mapEventCds);
                //pEventCode->c

    double      dEventCd(0.0);
    bool        bPriv(false);
    POSITION    pos(mapEventCds.GetStartPosition());
    INT_PTR     nEventCnt(mapEventCds.GetCount());

    CComSafeArray<double> pSafeArraypEventCode = NULL;
    for(INT_PTR count(0); count < nEventCnt; ++count)
    {
        mapEventCds.GetNextAssoc(pos, dEventCd, bPriv);     
        if (bPriv)
        {   
            pSafeArraypEventCode.Add(dEventCd);
        }
    }

    pEventCode->parray = pSafeArraypEventCode.Detach();
    // Empty the CMap
    mapEventCds.RemoveAll();

}
return S_OK;
}

最佳答案

你的问题在这里:

if (V_VT(pEventCode) == VT_ARRAY | VT_R8)

VB 等同于:

If V_VT(pEventCode) = VT_ARRAY Or True Then
//Do stuff
End If

| VT_R8 评估为 bool 值 true 因为: 1) == 优先于 |,因此执行比较,然后评估 VT_R8。 和 2) 在 C 中,任何非零值都等于“真”。由于 VT_R8 会自行计算(而不是作为比较的一部分),因此它始终为 true

您需要使用括号,以便您的语句按照您想要的顺序求值。

关于c++ - 如何将 double 组从 VB6 传递到 VC++..这段代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572461/

相关文章:

c++ - 传递引用参数并返回引用

vba - 向 VBA 或 Visual Basic 6 添加换行符

forms - 在窗体 VB6 中显示用户控件

vb6 - 通过拖动鼠标滚动图像

vb6 - 将相邻列表框上的滚动条链接在一起

javascript - 如何使用 java/vb 脚本调用自定义 ActiveX dll 中的方法

c++ - 实现Matlab的冒号: operator in C++ expression templates class

c++ - 我们可以为 int 或 float 等内置类型重载运算符吗?

c++ - 通过 C ABI 通过 void 指针传递 C++ 对象(可能具有多重虚拟继承)

c++ - Fuzzylite 与 Castalia Simulator 集成的控制台问题