다음을 통해 공유


메모리 할당

애플리케이션은 이 데이터에 대한 메모리를 할당해야 합니다. TAPI 및 서비스 공급자는 데이터를 제공합니다. 작업이 비동기인 경우 비동기 회신 메시지가 성공을 나타내기 전까지는 데이터를 사용할 수 없습니다.

애플리케이션과 TAPI 간에 데이터를 전달하는 데 사용되는 모든 데이터 구조는 평면화됩니다. 즉, 데이터 구조에는 변함없이 크기가 조정된 데이터 구성 요소가 포함된 하위 구조에 대한 포인터가 포함되지 않습니다. 대신 애플리케이션에 가변적인 양의 데이터를 다시 전달하는 데 사용되는 데이터 구조에는 다음과 같은 메타 구조가 있어야 합니다.

  DWORD  dwTotalSize;
  DWORD  dwNeededSize;
  DWORD  dwUsedSize; 
    <fixed size fields> 
  DWORD  dw<VarSizeField1>Size;
  DWORD  dw<VarSizeField1>Offset; 
    <fixed size fields> 
  DWORD  dw<VarSizeField2>Size;
  DWORD  dw<VarSizeField2>Offset; 
    <common extensions> 
    <var sized field1> 
    <var sized field2>

dwTotalSize 멤버는 이 데이터 구조에 할당된 크기(바이트)입니다. 데이터 구조의 끝을 표시하고 이 데이터 구조를 사용하는 함수를 호출하기 전에 애플리케이션에서 설정합니다. 함수는 이 크기를 초과하여 읽거나 쓰지 않습니다. 애플리케이션은 구조체의 내용을 반환하기 위해 TAPI에 할당된 총 바이트 수를 나타내기 위해 dwTotalSize 멤버를 설정해야 합니다.

TAPI는 dwNeededSize 멤버를 채웁니다. 요청된 모든 데이터를 반환하는 데 필요한 바이트 수를 나타냅니다. 크기가 가변적으로 크기가 조정된 필드가 있으면 애플리케이션에서 할당하는 데 필요한 데이터 구조 크기를 예측하는 것이 불가능한 경우가 많습니다. 이 필드는 데이터에 실제로 필요한 바이트 수를 반환합니다. 이 숫자는 dwTotalSize보다 작거나 같거나 클 수 있으며 dwTotalSize 멤버 자체에 대한 공간을 포함합니다. 큰 경우 반환된 구조체는 부분적으로만 채워집니다. 애플리케이션에 필요한 필드를 부분 구조에서 사용할 수 있는 경우 다른 작업은 수행하지 않아야 합니다. 그렇지 않으면 애플리케이션이 dwNeededSize 크기의 구조를 할당하고 함수를 다시 호출해야 합니다. 일반적으로 이번에는 모든 정보를 반환할 수 있는 충분한 공간을 사용할 수 있지만 크기가 다시 증가할 수 있습니다.

TAPI는 유용한 데이터를 포함하는 데이터 구조 부분의 실제 크기(바이트)를 나타내기 위해 애플리케이션에 데이터를 반환하는 경우 dwUsedSize 멤버를 채웁니다. 예를 들어 할당된 구조체가 너무 작고 잘린 필드가 변함없이 크기가 조정된 필드인 경우 dwNeededSizedwTotalSize보다 크고 잘린 필드는 비어 있습니다. 따라서 dwUsedSize 멤버는 dwTotalSize보다 작을 수 있습니다. 부분 필드 값이 반환되지 않습니다.

이 헤더 다음에는 데이터 구조의 고정된 부분이 있습니다. 여기에는 실제 가변 크기 필드를 설명하는 일반 필드와 크기/오프셋 쌍이 포함되어 있습니다. 오프셋 필드에는 레코드 시작부터 가변 크기 필드의 오프셋(바이트)이 포함됩니다. 크기 필드에는 고정 크기 필드의 크기(바이트)가 포함됩니다. 고정 크기 필드가 비어 있으면 크기 필드가 0이고 오프셋이 0으로 설정됩니다. 전체 구조 크기가 충분하지 않은 경우 잘릴 수 있는 가변 크기 필드가 비어 있습니다. 즉, 크기 필드가 0으로 설정되고 오프셋이 0으로 설정됩니다. 고정된 크기의 필드는 고정 필드를 따릅니다.

서비스 공급자가 변수 멤버를 채워야 하는 경우 TAPI는 해당 크기 및 오프셋 멤버를 0으로 초기화합니다. 서비스 공급자가 변수 멤버를 채우는 경우 변수 멤버를 설정하는 경우 dwUsedSize 및 dwNeededSize를 포함하여 해당 크기 및 오프셋 멤버를 적절한 값으로 설정해야 합니다. 서비스 공급자는 가변 멤버를 잘라내어 사용 가능한 공간에 맞도록 해서는 안됩니다.

서비스 공급자는 구조체의 고정 멤버 바로 다음에 변수 멤버를 시작하고 TAPI가 가변 길이 멤버에 사용할 수 있도록 할당된 메모리의 끝에 추가 공간을 두어야 합니다. 변수 멤버를 순서대로 배치할 수 있지만 멤버는 연속되어야 합니다.