Menggunakan Pustaka COM

Referensi pustaka terkelola PC Tablet sekarang dapat ditemukan di bagian referensi Pustaka Kelas Windows Vista SDK reguler. Ini menyediakan model objek untuk Microsoft Visual C++. Sebagian besar objek di Pustaka COM identik dengan yang ditemukan di TABLET PC Managed API.

Namun, COM API berisi beberapa anggota selain yang ditemukan di API Terkelola karena perbedaan antara lingkungan Microsoft Win32 standar dan lingkungan Microsoft .NET Frameworksoftware development kit (SDK). Misalnya, objek InkRectangle dan InkTransform digunakan dalam COM, tetapi FrameworkSDK menyediakan implementasi asli untuk Kelas InkRectangle dan Kelas InkTransform yang menghilangkan kebutuhan akan objek ini di platform TABLET PC Managed API.

Catatan

Objek dalam COM API dan kontrol tinta tidak dirancang untuk digunakan di Halaman Server Aktif (ASP).

 

Bekerja dengan Koleksi

Jika Anda meneruskan nilai NULL sebagai indeks ke salah satu objek koleksi di Pustaka COM, Anda menerima item pertama dalam koleksi karena nilai argumen ini dipaksa ke 0 saat panggilan dilakukan.

Properti _NewEnum ditandai terbatas dalam definisi Bahasa Definisi Antarmuka (IDL) untuk antarmuka pengumpulan.

Di C++, gunakan perulangan For... untuk melakukan iterasi melalui koleksi dengan terlebih dahulu mendapatkan panjang koleksi. Contoh di bawah ini menunjukkan cara melakukan iterasi melalui goresan objek 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
              // ...
            }
        }
    }
}

Parameter

Jika Anda meneruskan VT_EMPTY atau VT_NULL sebagai indeks ke salah satu objek koleksi di Pustaka COM, Anda menerima item pertama dalam koleksi karena nilai argumen ini dipaksa ke 0 saat panggilan dilakukan.

Menggunakan IDispatch

Untuk meningkatkan performa, antarmuka pemrograman aplikasi TABLET PC Platform COM (API) tidak mendukung panggilan IDispatchImpl::Invoke dengan struktur DISPPARAMS dengan argumen bernama. IDispatchImpl::GetIDsOfNames ini juga tidak didukung. Sebagai gantinya, panggil Invoke dengan DISPID yang disediakan di header SDK.

Menunggu Peristiwa

Lingkungan PC Tablet multithreaded. Lihat dokumentasi COM untuk multi-utas.

Dukungan untuk Agregasi

Agregasi telah diuji hanya untuk kontrol InkEdit , kontrol InkPicture , objek InkDisp , dan objek InkOverlay . Agregasi belum diuji untuk kontrol dan objek lain di pustaka.

C++

Menggunakan Tablet PC SDK di C++ memerlukan penggunaan beberapa konsep COM, seperti VARIAN, SAFEARRAY, dan BSTR. Bagian ini menjelaskan cara menggunakannya.

VARIAN dan SAFEARRAY

Struktur VARIAN digunakan untuk komunikasi antara objek COM. Pada dasarnya, struktur VARIAN adalah kontainer untuk serikat besar yang membawa banyak jenis data.

Nilai dalam anggota pertama struktur, vt, menjelaskan anggota serikat mana yang valid. Saat Anda menerima informasi dalam struktur VARIAN, periksa anggota vt untuk mengetahui anggota mana yang berisi data yang valid. Demikian pula, ketika Anda mengirim informasi menggunakan struktur VARIAN, selalu atur vt untuk mencerminkan anggota serikat pekerja yang berisi informasi.

Sebelum menggunakan struktur, inisialisasi dengan memanggil fungsi VariantInit COM. Setelah selesai dengan struktur, bersihkan sebelum memori yang berisi VARIAN dikosongkan dengan memanggil VariantClear.

Untuk informasi selengkapnya tentang struktur VARIAN, lihat Jenis Data VARIANTARG dan VARIANTARG.

Struktur SAFEARRAY disediakan sebagai cara untuk bekerja dengan aman dengan array di COM. Bidang parray VARIAN adalah penunjuk ke SAFEARRAY. Gunakan fungsi seperti SafeArrayCreateVector, SafeArrayAccessData, dan SafeArrayUnaccessData untuk membuat dan mengisi SAFEARRAY dalam VARIAN.

Untuk informasi selengkapnya tentang jenis data SAFEARRAY, lihat Jenis Data SafeArray.

Contoh C++ ini membuat IInkStrokeDisp , , pInkStrokeDispdalam objek InkDisp , pInk, dari array data titik.

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

Format string yang didukung untuk COM adalah BSTR. BSTR memiliki penunjuk ke string yang dihentikan nol, tetapi juga berisi panjang string (dalam byte, tidak menghitung terminator), yang disimpan dalam 4 byte segera sebelum karakter pertama string.

Untuk informasi selengkapnya tentang BSTR, lihat Jenis Data BSTR.

Sampel C++ ini menunjukkan cara mengatur factoid pada InkRecognizerContext menggunakan 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);
}