다음을 통해 공유


SafeArrayCreateEx 함수(oleauto.h)

지정된 VARTYPE, 차원 및 범위 수에서 안전한 배열 설명자를 만들고 반환합니다.

구문

SAFEARRAY * SafeArrayCreateEx(
  [in] VARTYPE        vt,
  [in] UINT           cDims,
  [in] SAFEARRAYBOUND *rgsabound,
  [in] PVOID          pvExtra
);

매개 변수

[in] vt

배열의 각 요소에 대한 기본 형식 또는 VARTYPE입니다. 변형 형식 VT_RECORD 대해 FADF_RECORD 플래그를 설정할 수 있고, VT_DISPATCH 또는 VT_UNKNOWN FADF_HAVEIID 플래그를 설정할 수 있으며, 다른 모든 VARTYPE에 대해 FADF_HAVEVARTYPE 설정할 수 있습니다.

[in] cDims

배열의 차수입니다.

[in] rgsabound

배열에 할당할 경계 벡터(각 차원마다 하나씩)입니다.

[in] pvExtra

사용자 정의 형식의 안전한 배열을 만드는 경우 사용자 정의 형식의 형식 정보입니다. vt 매개 변수가 VT_RECORD 경우 pvExtra 는 레코드를 설명하는 IRecordInfo 에 대한 포인터가 됩니다. vt 매개 변수가 VT_DISPATCH 또는 VT_UNKNOWN 경우 pvExtra는 배열에 전달되는 인터페이스의 형식을 나타내는 GUID에 대한 포인터를 포함합니다.

반환 값

안전한 배열 설명자이거나 배열을 만들 수 없는 경우 null입니다.

설명

VARTYPE이 VT_RECORD 경우 SafeArraySetRecordInfo 가 호출됩니다. VARTYPE이 VT_DISPATCH 또는 VT_UNKNOWN 경우 배열의 요소에는 동일한 형식의 인터페이스가 포함되어야 합니다. 이 배열을 다른 프로세스로 마샬링하는 프로세스의 일부에는 pvExtra 매개 변수가 가리키는 IID의 프록시/스텁 코드 생성이 포함됩니다. 다른 유형의 인터페이스를 실제로 전달하려면 pvExtra 에서 IID_IUnknown 또는 IID_IDispatch 지정하고 호출자가 실제 인터페이스를 쿼리하는 방법을 식별하는 다른 방법을 제공해야 합니다.

예제

다음 예제에서는 사용자 정의 형식의 안전한 배열을 형식 VT_RECORD 변형에 저장하는 방법을 설명합니다.

SAFEARRAYBOUND * sab;
sab.cElements = 2;
sab.lLbound = 0;
hresult hr;

SAFEARRAY Sa;
Sa = SafeArrayCreateEx(VT_RECORD, 1, &sab, pRecInfo);
if (Sa == NULL)
   return E_OUTOFMEMORY;

PVOID pvData;
hr = SafeArrayAccessData(Sa, &pvData);
if (FAILED(hr)) {
   SafeArrayDestroy(Sa);
   return hr;
}

TEST * pTest;
pTest = (TEST *)pvData;
pTest[0] = a;
pTest[1] = b;
hr = SafeArrayUnaccessData(Sa);
if (FAILED(hr)) {
   SafeArrayDestroy(Sa);
   return hr;
}

VariantInit(&variant);
V_VT(&variant) = VT_ARRAY|VT_RECORD;
V_ARRAY(&variant) = Sa;

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 oleauto.h
라이브러리 OleAut32.lib
DLL OleAut32.dll