Megosztás a következőn keresztül:


A COM-kódtár használata

A táblaszámítógép által felügyelt kódtár referenciája mostantól megtalálható a Windows Vista SDK osztálytár referenciaszakaszában. Objektummodellt biztosít a Microsoft Visual C++-hoz. A COM-kódtárban található objektumok többsége megegyezik a Táblagép pc által felügyelt API-ban található objektumokkal.

A COM API azonban a felügyelt API-ban találhatóakon kívül néhány tagot is tartalmaz, mivel a standard Microsoft Win32 környezet és a Microsoft .NET Frameworksoftware fejlesztői készlet (SDK) környezete között különbségek vannak. Az InkRectangle és az InkTransform objektumokat például a COM-ban használják, de a FrameworkSDK natív implementációt biztosít a InkRectangle osztály és InkTransform Osztály, amely szükségtelenné teszi ezeket az objektumokat a Táblaszámítógép platform felügyelt API-jában.

Jegyzet

A COM API objektumai és a tinta vezérlőelemek nem az Active Server Pagesben (ASP) való használatra lettek kialakítva.

 

Gyűjtemények használata

Ha egy NULL értéket ad át indexként a COM-kódtárban található gyűjteményobjektumok bármelyikének, megkapja a gyűjtemény első elemét, mert ezek az argumentumértékek a híváskor 0-ra vannak kényszerítve.

A _NewEnum tulajdonság korlátozottként van megjelölve a gyűjteményi felületek interfészdefiníciós nyelvének (IDL) definíciójában.

A C++-ban használjon egy For... hurkot a gyűjteményen keresztüli iteráláshoz a gyűjtemény hosszának első lekérésével. Az alábbi példa bemutatja, hogyan lehet iterálni egy InkDisp objektum vonásain, 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éterek

Ha VT_EMPTY-t vagy VT_NULL-t ad meg a COM-könyvtár gyűjtemény objektumai indexeként, a gyűjtemény első elemét kapja, mert ezek az argumentumértékek a híváskor 0-ra kényszerülnek.

Az IDispatch használata

A teljesítmény növelése érdekében a Táblaszámítógép-platform COM alkalmazásprogramozási felülete (API) nem támogatja az elnevezett argumentumokkal rendelkező DISPPARAMS-struktúrával rendelkező IDispatchImpl::Invoke meghívását. A IDispatchImpl::GetIDsOfNames szintén nem támogatott. Ehelyett hívja meg Invoke az SDK-fejlécekben megadott DISPID-kkel.

Várakozás eseményekre

A Táblagép PC-környezet többszálú. A többszálú feldolgozáshoz tekintse meg a COM dokumentációját.

Az összesítés támogatása

Az aggregációt csak a InkEdit vezérlő, az InkPicture vezérlő, a InkDisp objektum és a InkOverlay objektum esetében teszteltük. Az összesítés nem lett tesztelve a tár más vezérlőihez és objektumaihoz.

C++

A Tablet PC SDK C++-ban való használatához bizonyos COM-fogalmak, például a VARIANT, a SAFEARRAY és a BSTR használata szükséges. Ez a szakasz a használatukat ismerteti.

VARIANT és SAFEARRAY

A VARIANT szerkezet a COM-objektumok közötti kommunikációhoz használható. A VARIANT szerkezet lényegében egy nagy uniót tartalmazó tároló, amely számos adattípust hordoz.

A struktúra első tagjának (vt) értéke azt írja le, hogy a szakszervezeti tagok közül melyik érvényes. Amikor egy VARIANT-struktúrában kap információt, ellenőrizze a vt tagot, hogy megtudja, melyik tag tartalmaz érvényes adatokat. Hasonlóképpen, ha VARIANT-struktúrával küld adatokat, mindig állítsa be a vt-t úgy, hogy az tükrözze az információkat tartalmazó szakszervezeti tagot.

A struktúra használata előtt inicializálja a VariantInit COM függvény meghívásával. Miután végzett a szerkezettel, tisztítsa meg azt, mielőtt a VARIANT-t tartalmazó memória felszabadulna a VariantClear meghívásával.

A VARIANT-struktúráról további információt VARIANT és VARIANTARG adattípusokcímű témakörben talál.

A SAFEARRAY struktúra biztosítja a tömbök COM-ban való biztonságos használatát. A VARIANT parray mezője egy SAFEARRAY-re mutatóként szolgál. Használjon olyan függvényeket, mint a SafeArrayCreateVector, a SafeArrayAccessData és a SafeArrayUnaccessData, hogy létrehozhasson és kitöltsön egy SAFEARRAY-t egy VARIANT-ban.

A SAFEARRAY adattípussal kapcsolatos további információkért lásd SafeArray adattípus.

Ez a C++ példa létrehoz egy IInkStrokeDisp , pInkStrokeDisp, egy InkDisp objektumban, pInkegy pontadatok tömbéből.

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

A COM támogatott karakterlánc formátuma a BSTR. A BSTR-nek van egy nulla végződésű sztringre mutató mutatója, de tartalmazza a sztring hosszát is (bájtban, nem számítva a terminátort), amelyet a sztring első karakterét közvetlenül megelőző 4 bájtban tárol.

További információ a BSTR-ről: BSTR adattípus.

Ez a C++ minta bemutatja, hogyan állíthatja be BSTR használatával a factoidot egy InkRecognizerContext esetében.

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);
}