Aracılığıyla paylaş


COM Kitaplığı'nı kullanma

Tablet PC yönetimli kitaplık başvurusu artık standart Windows Vista SDK Sınıf Kitaplığı başvurusu bölümünde bulunabilir. Microsoft Visual C++ için bir nesne modeli sağlar. COM Kitaplığı'ndaki nesnelerin çoğu, Tablet PC Yönetilen API'sinde bulunanlarla aynıdır.

Ancak COM API'sinde, standart Microsoft Win32 ortamı ile Microsoft .NET Frameworksoftware geliştirme seti (SDK) ortamı arasındaki farklar nedeniyle Yönetilen API'de bulunanlara ek olarak bazı üyeler bulunur. Örneğin, InkRectangle ve InkTransform nesneleri COM'da kullanılır, ancak FrameworkSDK, InkRectangle Sınıfı için yerel uygulama sağlar ve Tablet PC platformu Yönetilen API'sinde bu nesnelere olan ihtiyacı ortadan kaldıran InkTransform Sınıfı.

Not

COM API'sindeki ve mürekkep denetimlerindeki nesneler, Active Server Pages'da (ASP) kullanılmak üzere tasarlanmamıştır.

 

Koleksiyonlarla Çalışma

COM Kitaplığı'ndaki koleksiyon nesnelerinden herhangi birine dizin olarak NULL değeri geçirirseniz, bu bağımsız değişken değerleri çağrı sırasında otomatik olarak 0'a dönüştürüldüğü için koleksiyondaki ilk öğeyi alırsınız.

_NewEnum özelliği, koleksiyon arabirimleri için Arabirim Tanım Dili (IDL) tanımında kısıtlanmış olarak işaretlenir.

C++'ta, önce koleksiyonun uzunluğunu alarak bir koleksiyonda yineleme yapmak için bir For... döngüsü kullanın. Aşağıdaki örnekte, InkDisp nesnesinin vuruşlarında nasıl yineleme pInkgösterilmektedir.

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
              // ...
            }
        }
    }
}

Parametreler

VT_EMPTY veya VT_NULL'u COM Kütüphanesi'ndeki koleksiyon nesnelerinden herhangi birine dizin olarak geçerseniz, bu bağımsız değişken değerleri çağrı sırasında 0'a zorlandığından koleksiyondaki ilk öğeyi alırsınız.

IDispatch kullanma

Performansı artırmak için Tablet PC Platformu COM uygulama programlama arabirimi (API), adlandırılmış bağımsız değişkenler içeren DISPPARAMS yapısına sahip IDispatchImpl::Invoke çağrılmasını desteklemez. IDispatchImpl::GetIDsOfNames de desteklenmez. Bunun yerine, SDK üst bilgilerinde sağlanan DISPID'lerle Invoke çağırın.

Olayların Beklenmesi

Tablet PC ortamı çoklu iş parçacıklı. Çoklu iş parçacığı oluşturma konusunda bilgi almak için COM belgelerine başvurun.

Toplama desteği

Toplama yalnızca InkEdit denetimi, InkPicture denetimi, InkDisp nesnesi ve InkOverlay nesnesi için test edilmiştir. Toplama, kitaplıktaki diğer denetimler ve nesneler için test edilmedi.

C++

Tablet PC SDK'sını C++ dilinde kullanmak VARIANT, SAFEARRAY ve BSTR gibi bazı COM kavramlarının kullanılmasını gerektirir. Bu bölümde bunların nasıl kullanılacağı açıklanmaktadır.

VARIANT ve SAFEARRAY

VARIANT yapısı, COM nesneleri arasındaki iletişim için kullanılır. Temelde VARIANT yapısı, birçok veri türünü taşıyan büyük bir birleşime yönelik bir kapsayıcıdır.

Yapının ilk üyesi olan vt'deki değer, birleşim üyelerinden hangilerinin geçerli olduğunu açıklar. VARIANT yapısında bilgi aldığınızda, hangi üyenin geçerli veriler içerdiğini öğrenmek için vt üyesini denetleyin. Benzer şekilde, VARIANT yapısı kullanarak bilgi gönderdiğinizde, vt'yi her zaman bilgileri içeren birleşim üyesini yansıtacak şekilde ayarlayın.

Yapıyı kullanmadan önce VariantInit COM işlevini çağırarak başlatın. Yapıyla işiniz bittiğinde, VARIANT'ı içeren belleği serbest bırakmadan önce temizlemek için VariantClear çağrısını yapın.

VARIANT yapısı hakkında daha fazla bilgi için bkz. VARIANT ve VARIANTARG Veri Türleri.

SAFEARRAY yapısı, COM'daki dizilerle güvenli bir şekilde çalışmanın bir yolu olarak sağlanır. VARIANT'ın parray alanı, bir SAFEARRAY'e işaret eden bir işaretçidir. VARIANT içinde bir SAFEARRAY oluşturmak ve doldurmak için SafeArrayCreateVector, SafeArrayAccessData ve SafeArrayUnaccessData işlevlerini kullanın.

SAFEARRAY veri türü hakkında daha fazla bilgi için bkz. SafeArray Veri Türü.

Bu C++ örneği, bir InkDisp nesnesinde bir IInkStrokeDisp , pInkStrokeDisp, pInkbir nokta veri dizisinden oluşturur.

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 için desteklenen dize biçimi BSTR'dir. BSTR, sonu sıfırla biten bir dizeye işaret eden bir işaretçiye sahiptir, ancak aynı zamanda dizenin uzunluğunu da içerir (terminatör hariç olarak bayt cinsinden), ki bu uzunluk dizenin ilk karakterinden hemen önceki 4 baytta depolanır.

BSTR hakkında daha fazla bilgi için bkz. BSTR Veri Türü.

Bu C++ örneği, BSTR kullanarak bir InkRecognizerContext üzerinde factoid ayarlamanın nasıl yapıldığını gösterir.

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