Поделиться через


Использование COM-библиотеки

Справочник по управляемой библиотеке планшетного компьютера теперь можно найти в разделе справочника по библиотеке классов Windows Vista SDK. Он предоставляет объектную модель для Microsoft Visual C++. Большинство объектов в библиотеке COM идентичны объектам, найденным в управляемом API планшетного компьютера.

Однако COM API содержит некоторых членов в дополнение к тем, которые находятся в управляемом API, из-за различий между стандартной средой Microsoft Win32 и средой Microsoft .NET Framework software development kit (SDK). Например, объекты InkRectangle и InkTransform используются в COM, но FrameworkSDK предоставляет собственную реализацию для класса InkRectangle и класса InkTransform, что устраняет необходимость в этих объектах в Управляемом API Планшетного ПК.

Заметка

Объекты в COM-API и элементах управления рукописным вводом не предназначены для использования на страницах Active Server (ASP).

 

Работа с коллекциями

Если вы передаете значение NULL в качестве индекса любому из объектов коллекции в библиотеке COM, вы получите первый элемент в коллекции, так как эти аргументы приводятся к 0 при вызове.

Свойство _NewEnum отмечено ограниченным в определении языка определения интерфейса (IDL) для интерфейсов коллекции.

В C++используйте цикл For... для итерации коллекции, сначала получив длину коллекции. В приведенном ниже примере показано, как выполнять итерацию по штрихам объекта InkDisp pInk.

IInkStrokes* pStrokes;
HRESULT result = pInk->get_Strokes(&pStrokes);
if (SUCCEEDED(result))
{
    // Loop over strokes
    long nStrokes;
    result = pStrokes->get_Count(&nStrokes);
    if (SUCCEEDED(result))
    {
        for (int i =0; i < nStrokes; i++)
        {
            IInkStrokeDisp* pStroke;
            result = pStrokes->Item(i, &pStroke);
            if (SUCCEEDED(result))
            {
              // Code that uses pStroke
              // ...
            }
        }
    }
}

Параметры

Если вы передаете VT_EMPTY или VT_NULL в качестве индекса в любой из объектов коллекции в библиотеке COM, вы получите первый элемент в коллекции, так как эти значения аргументов приводятся к 0 при вызове.

Использование IDispatch

Чтобы повысить производительность, интерфейс программирования приложений (API) платформы планшетного ПК не поддерживает вызов IDispatchImpl::Invoke со структурой DISPPARAMS с именованными аргументами. IDispatchImpl::GetIDsOfNames также не поддерживается. Вместо этого вызовите Invoke с идентификаторами DISPID, предоставленными в заголовках пакета SDK.

Ожидание событий

Среда работы планшетного компьютера является многопоточной. Дополнительные сведения см. в документации по COM для многопоточных операций.

Поддержка агрегирования

Агрегирование было проверено только для элемента управления InkEdit, элемента управления InkPicture, объекта InkDisp и объекта InkOverlay. Агрегирование не было проверено для других элементов управления и объектов в библиотеке.

C++

Для использования пакета SDK для планшетного ПК в C++ требуется использование некоторых концепций COM, таких как VARIANT, SAFEARRAY и BSTR. В этом разделе описывается, как использовать их.

VARIANT и SAFEARRAY

Структура VARIANT используется для обмена данными между COM-объектами. По сути, структура VARIANT — это контейнер для большого объединения, который содержит множество типов данных.

Значение в первом элементе структуры, vt, описывает, какой из членов объединения является действительным. При получении сведений в структуре VARIANT проверьте элемент vt, чтобы узнать, какой элемент содержит допустимые данные. Аналогичным образом, при отправке информации с помощью структуры VARIANT всегда задавайте значение vt, чтобы отразить элемент объединения, содержащий информацию.

Перед использованием структуры инициализируйте ее, вызвав функцию COM VariantInit. По завершении работы со структурой очистите ее до освобождения памяти, содержащей VARIANT, путем вызова VariantClear.

Дополнительные сведения о структуре VARIANT см. в типах данных VARIANT и VARIANTARG.

Структура SAFEARRAY предоставляется как способ безопасной работы с массивами в COM. Поле parray VARIANT — это указатель на SAFEARRAY. Используйте такие функции, как SafeArrayCreateVector, SafeArrayAccessData и SafeArrayUnaccessData, чтобы создать и заполнить SAFEARRAY в VARIANT.

Дополнительные сведения о типе данных SAFEARRAY см. в SafeArray Data Type.

В этом примере на C++ создается объект IInkStrokeDisp, pInkStrokeDisp, в объекте InkDisppInkиз массива данных точек.

VARIANT   var, varPK;
LONG*   plongArray=NULL;
POINT   ptArray[2]={0};
long   lSize=0;
IInkStrokeDisp* pInkStrokeDisp;

IInkDisp*   pInk;   // the object should be created correctly 
                    // elsewhere and assigned here.
HRESULT   hr=E_FAIL;

ptArray[0].x = 20;
ptArray[0].y = 100;
ptArray[1].x = 30;
ptArray[1].y = 110;
lSize = 2;   // two points

VariantInit( &var );
VariantInit( &varPK );
SAFEARRAY* psa = SafeArrayCreateVector( VT_I4, 0, lSize*2 );
if( psa )
{
  if( SUCCEEDED( hr = SafeArrayAccessData( psa, (void**)&plongArray) ))
   {
      for( long i = 0; i < lSize; i++ ) 
      {
         plongArray[2*i] = ptArray[i].x;
         plongArray[2*i+1] = ptArray[i].y;
      }
      hr = SafeArrayUnaccessData( psa );

      if ( SUCCEEDED( hr ) ) 
      {
         var.vt     = VT_ARRAY | VT_I4;
         var.parray = psa;

        // varPK (packet description) is currently reserved, so it is
        // just empty variant for now.
         pInk->CreateStroke( var, varPK, &pInkStrokeDisp );   
      }
   }
}
VariantClear( &var );
VariantClear( &varPK );

BSTR

Поддерживаемый формат строки для COM — BSTR. BSTR имеет указатель на строку, завершающуюся нулём, но она также содержит длину строки (в байтах, не включая завершающий нуль), которая хранится в 4 байтах сразу перед первым символом строки.

Дополнительные сведения о типа данных BSTR см. в .

В этом примере C++ показано, как задать фактоид на InkRecognizerContext с помощью BSTR.

IInkRecognizerContext* pRecognizerContext = NULL;
result = CoCreateInstance(CLSID_InkRecognizerContext, 
    NULL, CLSCTX_INPROC_SERVER,
    IID_IInkRecognizerContext, 
    (void **) &pRecognizerContext);
if SUCCEEDED(result)
{
    BSTR bstrFactoid = SysAllocString(FACTOID_DATE);
    result = pRecognizerContext->put_Factoid(bstrFactoid);
    if SUCCEEDED(result)
    {
      // Use recognizer context...
      // ...
    }
    SysFreeString(bstrFactoid);
}