Share via


使用 COM 程式庫

平板電腦受管理程式庫參考現在可以在一般 Windows Vista SDK 類別庫參考一節中找到。 它提供Microsoft Visual C++的物件模型。 COM 程式庫中大部分的物件都與平板電腦受管理 API 中找到的物件相同。

不過,COM API 除了受控 API 中找到的成員之外,還包含一些成員,因為標準 Microsoft Win32 環境與 Microsoft .NET Frameworksoftware 開發工具組 (SDK) 環境之間的差異。 例如,InkRectangle 和 InkTransform 物件用於 COM 中,但 FrameworkSDK 會為 InkRectangle 類別InkTransform 類別 提供原生實作,而不需要在平板電腦平臺 Managed API 中使用這些物件。

注意

COM API 和筆跡控制項中的物件並非設計來用於 Active Server Pages (ASP) 。

 

使用集合

如果您將 Null 值當做索引傳遞至 COM Library 中任何集合物件的索引,您會收到集合中的第一個專案,因為這些引數值會在進行呼叫時強制為 0。

_NewEnum屬性在集合介面的介面定義語言 (IDL) 定義中標示為受限制。

在 C++ 中,先取得集合的長度,使用 For... 迴圈逐一查看集合。 下列範例示範如何逐一查看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
              // ...
            }
        }
    }
}

參數

如果您傳入VT_EMPTY或VT_Null做為 COM Library 中任何集合物件的索引,您會收到集合中的第一個專案,因為這些引數值會在進行呼叫時強制為 0。

使用 IDispatch

為了提升效能,平板電腦平臺 COM 應用程式開發介面 (API) 不支援使用具名引數的 DISPPARAMS 結構呼叫 IDispatchImpl::InvokeIDispatchImpl::GetIDsOfNames也不支援 。 請改用 SDK 標頭中提供的 DISPID 呼叫 Invoke

等候事件

平板電腦環境已多執行緒。 請參閱多執行緒的 COM 檔。

支援匯總

匯總已經過僅針對 InkEdit 控制項、 InkPicture 控制項、 InkDisp 物件和 InkOverlay 物件進行測試。 匯總尚未測試程式庫中的其他控制項和物件。

C++

在 C++ 中使用平板電腦 SDK 需要使用一些 COM 概念,例如 VARIANT、SAFEARRAY 和 BSTR。 本節說明如何使用它們。

VARIANT 和 SAFEARRAY

VARIANT 結構用於 COM 物件之間的通訊。 基本上,VARIANT 結構是具有許多資料類型之大型聯集的容器。

結構第一個成員 vt 中的值會描述哪一個聯集成員有效。 當您在 VARIANT 結構中收到資訊時,請檢查 vt 成員,以找出哪些成員包含有效的資料。 同樣地,當您使用 VARIANT 結構傳送資訊時,一律將 vt 設定為反映包含資訊的聯集成員。

使用 結構之前,請先呼叫 VariantInit COM 函式將其初始化。 當結構完成時,請先清除它,再呼叫 VariantClear 釋放包含 VARIANT 的記憶體。

如需 VARIANT 結構的詳細資訊,請參閱 VARIANT 和 VARIANTARG 資料類型

SAFEARRAY 結構是以安全方式在 COM 中使用陣列的方式提供。 VARIANT 的 parray 欄位是 SAFEARRAY 的指標。 使用 SafeArrayCreateVector、SafeArrayAccessData 和 SafeArrayUnaccessData 等函式,在 VARIANT 中建立並填入 SAFEARRAY。

如需 SAFEARRAY 資料類型的詳細資訊,請參閱 SafeArray 資料類型

這個 C++ 範例會從點資料的陣列,在InkDisp物件 pInk 中建立IInkStrokeDisppInkStrokeDisp

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 支援的字串格式為 BSTR。 BSTR 具有以零結尾字串的指標,但也包含以位元組為單位的字串長度 (,而不是計算結束字元) ,其儲存在字串第一個字元之前的 4 個位元組。

如需 BSTR 的詳細資訊,請參閱 BSTR 資料類型

此 C++ 範例示範如何使用 BSTR 在 InkRecognizerCoNtext 上設定 factoid。

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