0

E_INVALIDARG エラーが発生します

STDMETHODIMP CDocumentController::HasPrivEventCode(double dUserId,double dPosCd,double dPPRCd,SAFEARRAY** pEventCode)
{ 
    // TODO: Add your implementation code here
    long lElements; // number of elements in the array
    long lCount;
    HRESULT lResult; // return code for OLE functions
    double *pArrayElements; // pointer to the elements of the array

    // checking if it is a one-dimensional array
    if ( (*pEventCode)->cDims != 1 ) return(E_FAIL);

    // checking if it is an array of double
    if ( (*pEventCode)->cbElements != 8 ) return(E_FAIL);

    // how many elements are there in the array
    lElements=(*pEventCode)->rgsabound[0].cElements;

    // locking the array before using its elements
    lResult=SafeArrayLock(*pEventCode);
    if (lResult != S_OK) return(E_FAIL);

    // using the array
    pArrayElements=(double*) (*pEventCode)->pvData;

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

    for (lCount=0; lCount<lElements; lCount++) 
    { 
        double lVal = pArrayElements[lCount]; 
        mapEventCds.SetAt(lVal, false); 
    } 
    CheckPrivViewResultEventCds(dUserId, dPosCd, dPPRCd, mapEventCds); 

    long iEventCdIdx(0);
    double          dEventCd(0.0); 
    bool            bPriv(false); 
    POSITION        pos(mapEventCds.GetStartPosition()); 
    INT_PTR             nEventCnt(mapEventCds.GetCount()); 
    double* arrEventCdsWithPriv = new double[nEventCnt];
    VARIANT vt;

    //(*pEventCode)->pvData = NULL;

    lResult=SafeArrayUnlock(*pEventCode); 
    HRESULT hr = SafeArrayDestroyData(*pEventCode);

    for(INT_PTR count(0); count < nEventCnt; ++count) 
    { 
        mapEventCds.GetNextAssoc(pos, dEventCd, bPriv); 

        if (bPriv) 
        {   
            vt.vt = VT_R8;
            vt.dblVal = dEventCd;
            hr = SafeArrayPutElement(*pEventCode, &iEventCdIdx, &dEventCd);
            iEventCdIdx++;
        }   
    }
    // Empty the CMap 
    mapEventCds.RemoveAll(); 
    // releasing the array 
    lResult=SafeArrayUnlock(*pEventCode); 

    return S_OK;

}

*pEventCodeは私のセーフ配列です...は「double」値です... ( ) が true の場合、セーフ配列に値を1 つずつdEventCd挿入したいです... 助けてくださいdEventCd*pEventCodebPriv

4

1 に答える 1

0

あなたが使用している API の経験がありません。SAFEARRAYしかし、 を作成し、値 2 を最初のインデックスに入れ、その値を正常に取得するこの小さなテスト アプリをまとめることができました。以下のコードで、 への呼び出しを含むコメント アウトされたセクションがあることがわかりますSafeArrayDestroyData。そのコードがコメント アウトされている場合、アプリは機能します。ただし、コードのコメントを外すと、突然 への呼び出しがSafeArrayPutElement失敗しE_INVALIDARGます。これはあなたの問題だと思います。要素をSAFEARRAY

#include "stdafx.h"

#include <OaIdl.h>
#include <iostream>
#include <comdef.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 1;

    SAFEARRAY FAR* psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);

    if (psa == NULL) {
        std::cout << "Could not create safe array";

        return 0;
    }

    auto hr = SafeArrayLock(psa);
    _com_error lockErr(hr);
    printf(lockErr.ErrorMessage());
    std::cout << std::endl;

    hr = SafeArrayUnlock(psa);
    _com_error unlockErr(hr);
    printf(unlockErr.ErrorMessage());
    std::cout << std::endl;

    //This block is causing the trouble!
    /*
    hr = SafeArrayDestroyData(psa);
    _com_error destroyErr(hr);
    printf(destroyErr.ErrorMessage());
    std::cout << std::endl;
    */

    LONG  rgIndex = 0;
    double d = 2.0;

    hr = SafeArrayPutElement(psa, &rgIndex, &d);

    _com_error putErr(hr);
    printf(putErr.ErrorMessage());
    std::cout << std::endl;

    if (hr == S_OK) {
        double out = 0;
        hr = SafeArrayGetElement(psa, &rgIndex, &out);

        _com_error getErr(hr);
        printf(putErr.ErrorMessage());
        std::cout << std::endl;

        std::cout << "the value of the element retrieved was: " << out;
    }

    std::cin.get();

    return 0;
}
于 2013-11-12T05:00:34.873 に答える