Partager via


Utilisation de la bibliothèque COM

Vous trouverez désormais les informations de référence sur la bibliothèque managée Tablet PC dans la section de référence de la bibliothèque de classes du Kit de développement logiciel (SDK) Windows Vista standard. Il fournit un modèle objet pour Microsoft Visual C++. La majorité des objets de la bibliothèque COM sont identiques à ceux de l’API gérée Tablet PC.

Toutefois, l’API COM contient certains membres en plus de ceux trouvés dans l’API managée en raison de différences entre l’environnement Microsoft Win32 standard et l’environnement du Kit de développement logiciel (SDK) Microsoft .NET Framework. Par exemple, les objets InkRectangle et InkTransform sont utilisés dans COM, mais FrameworkSDK fournit une implémentation native pour la classe InkRectangle et la classe InkTransform , ce qui élimine la nécessité de ces objets dans l’API managée de la plateforme Tablet PC.

Notes

Les objets dans l’API COM et les contrôles d’entrée manuscrite ne sont pas conçus pour être utilisés dans les pages ASP (Active Server Pages).

 

Utilisation de collections

Si vous passez une valeur NULL en tant qu’index à l’un des objets de collection dans la bibliothèque COM, vous recevez le premier élément de la collection, car ces valeurs d’argument sont coercées à 0 lorsque l’appel est effectué.

La propriété _NewEnum est marquée restreinte dans la définition IDL (Interface Definition Language) pour les interfaces de collection.

En C++, utilisez une For... boucle pour itérer dans une collection en obtenant d’abord la longueur de la collection. L’exemple ci-dessous montre comment itérer à travers les traits d’un objet 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
              // ...
            }
        }
    }
}

Paramètres

Si vous transmettez VT_EMPTY ou VT_NULL en tant qu’index à l’un des objets de collection dans la bibliothèque COM, vous recevez le premier élément de la collection, car ces valeurs d’argument sont codées à 0 lorsque l’appel est effectué.

Utilisation d’IDispatch

Pour améliorer les performances, l’interface de programmation d’application COM (API) tablet PC Platform ne prend pas en charge l’appel IDispatchImpl::Invoke avec une structure DISPPARAMS avec des arguments nommés. Le IDispatchImpl::GetIDsOfNames n’est pas non plus pris en charge. Au lieu de cela, appelez Invoke avec les DISPID fournis dans les en-têtes du SDK.

En attente d’événements

L’environnement Tablet PC est multithread. Reportez-vous à la documentation COM pour le multithreading.

Prise en charge de l’agrégation

L’agrégation a été testée uniquement pour le contrôle InkEdit , le contrôle InkPicture , l’objet InkDisp et l’objet InkOverlay . L’agrégation n’a pas été testée pour d’autres contrôles et objets dans la bibliothèque.

C++

L’utilisation du Kit de développement logiciel (SDK) Tablet PC en C++ nécessite l’utilisation de certains concepts COM, tels que VARIANT, SAFEARRAY et BSTR. Cette section décrit comment les utiliser.

VARIANT et SAFEARRAY

La structure VARIANT est utilisée pour la communication entre les objets COM. Essentiellement, la structure VARIANT est un conteneur pour une union volumineuse qui transporte de nombreux types de données.

La valeur du premier membre de la structure, vt, décrit lequel des membres de l’union est valide. Lorsque vous recevez des informations dans une structure VARIANT, case activée le membre vt pour savoir quel membre contient des données valides. De même, lorsque vous envoyez des informations à l’aide d’une structure VARIANT, définissez toujours vt pour refléter le membre de l’union qui contient les informations.

Avant d’utiliser la structure, initialisez-la en appelant la fonction COM VariantInit. Une fois la structure terminée, effacez-la avant que la mémoire qui contient le VARIANT soit libérée en appelant VariantClear.

Pour plus d’informations sur la structure VARIANT, consultez Types de données VARIANT et VARIANTARG.

La structure SAFEARRAY est fournie comme un moyen de travailler en toute sécurité avec des tableaux dans COM. Le champ parray de VARIANT est un pointeur vers un SAFEARRAY. Utilisez des fonctions telles que SafeArrayCreateVector, SafeArrayAccessData et SafeArrayUnaccessData pour créer et remplir un SAFEARRAY dans un VARIANT.

Pour plus d’informations sur le type de données SAFEARRAY, consultez Type de données SafeArray.

Cet exemple C++ crée un IInkStrokeDisp , , pInkStrokeDispdans un objet InkDisp , pInk, à partir d’un tableau de données de point.

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

Le format de chaîne pris en charge pour COM est BSTR. Un BSTR a un pointeur vers une chaîne sans fin, mais il contient également la longueur de la chaîne (en octets, sans compter la terminaison), qui est stockée dans les 4 octets qui précèdent immédiatement le premier caractère de la chaîne.

Pour plus d’informations sur BSTR, consultez Type de données BSTR.

Cet exemple C++ montre comment définir le factoid sur un InkRecognizerContext à l’aide d’un 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);
}