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, pInk
egy 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);
}