Aracılığıyla paylaş


TN039: mfc/ole Otomasyon uygulaması

[!NOT]

İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.

ole IDispatch arabirimi genel bakış

IDispatch Bir arabirimdir, uygulamalardaki yöntemlerini ve özelliklerini Visual BASIC ya da diğer diller gibi diğer uygulamalar yapabileceğiniz gibi uygulama özelliklerini kullanmak anlamına gelir.Bu arabirimin en önemli parçası olan IDispatch::Invoke işlevi.mfc kullanır "haritaları gönderme" uygulamak için IDispatch::Invoke.Düzeni veya "Şekil", mfc uygulaması bilgi gönderme eşleme sağlar, CCmdTarget-türetilmiş sınıfları, bunu doğrudan nesnesinin özelliklerini değiştirmek veya üye arama işlevleri gerçekleştirmek için nesnedeki, IDispatch::Invoke istekleri.

Çoğu uygulama programcısı ole Otomasyon ayrıntılarını gizlemek için çoğunlukla, ClassWizard ve mfc katılım.Programcı, uygulamada göstermek için gerçek işlevlerini concentrates ve temel Sıhhi tesisat hakkında endişelenmeniz gerekmez.

mfc planda ne yaptığını anlamak gerekli olduğu durumlar vardır.Bu notu nasıl framework atadığı adres DISPIDs üye işlevler ve özellikler.mfc atamak için kullandığı algoritma bilgisi DISPIDs yalnızca gerekli olduğunda uygulamanızın nesneler için "tür kitaplığı" oluşturduğunuzda gibi kimlikleri, bilmeniz gereken.

mfc DISPID atama

Otomasyon (Visual Basic kullanıcı, örneğin), son gördüğü halde gerçek adlarını Otomasyon özellikleri ve yöntemleri (örneğin, obj. kendi kod etkinShowWindow) uygulaması, IDispatch::Invoke gerçek adlarını almaz.En iyi duruma getirme nedeniyle aldığı bir DISPID, "yöntem veya erişilecek özelliği tanımlayan bir 32-bit sihirli tanıtım bilgileri" olduğu.Bu DISPID değerleri döndürülen IDispatch adlı başka bir yöntem aracılığıyla uygulama IDispatch::GetIDsOfNames.Automation istemci uygulaması çağıracak GetIDsOfNames her üye ya da özellik erişmek ve bunları sonraki aramalar için önbelleğe ağa bir kez IDispatch::Invoke.Bu şekilde pahalı dize arama yalnızca bir kez nesne kullanım başına yerine bir kez başına yapılır IDispatch::Invoke çağırın.

mfc belirler DISPIDs her yöntem ve özellik için iki şeye göre:

  • Dağıtma eşlemi (1 göreli) üstünde olan uzaklığı

  • Uzaklık en türetilmiş sınıftan (0 göreceli) gönderme eşleme

DISPID iki kısımdan oluşur.loword , DISPID ilk bileşen uzaklığı dağıtma eşlemi üstünden içerir.HIWORD uzaklığı en türetilmiş bir sınıf içerir.Örne?in:

class CDispPoint : public CCmdTarget
{
public:
    short m_x, m_y;
    ...
    DECLARE_DISPATCH_MAP()
    ...
};

class CDisp3DPoint : public CDispPoint
{
public:
    short m_z;
    ...
    DECLARE_DISPATCH_MAP()
    ...
};

BEGIN_DISPATCH_MAP(CDispPoint, CCmdTarget)
    DISP_PROPERTY(CDispPoint, "x", m_x, VT_I2)
    DISP_PROPERTY(CDispPoint, "y", m_y, VT_I2)
END_DISPATCH_MAP()

BEGIN_DISPATCH_MAP(CDisp3DPoint, CDispPoint)
    DISP_PROPERTY(CDisp3DPoint, "z", m_z, VT_I2)
END_DISPATCH_MAP()

Gördüğünüz gibi ole Otomasyon arabirimleri göstermek her iki sınıf vardır.Bu sınıflardan biri diğer türetilmiş ve bu nedenle ole Otomasyon bölümü de dahil olmak üzere temel sınıfın işlevlerini kullanır ("x" ve "y" özellikleri bu durumda).

mfc generate DISPIDs sınıfı CDispPoint aşağıdaki gibi:

property X    (DISPID)0x00000001
property Y    (DISPID)0x00000002

Bir temel sınıf özellikleri olmadığı için bu HIWORD , DISPID her zaman (CDispPoint için en türetilmiş sınıftan uzaklıktır sıfır) sıfırdır.

mfc generate DISPIDs sınıfı CDisp3DPoint aşağıdaki gibi:

property Z    (DISPID)0x00000001
property X    (DISPID)0x00010001
property Y    (DISPID)0x00010002

z özelliği verilen bir DISPID sıfır ile HIWORD CDisp3DPoint özellikler risklere sınıfında tanımlamış.Bir taban sınıfta x ve y özelliklerini tanımlamış HIWORD , DISPID uzaklığı en türetilmiş sınıf gelen bir türetme adresindeki bu özellikleri tanımlanmış sınıf olduğundan, 1 ' dir.

[!NOT]

loword ile açık eşleme girdileri var olsa bile her zaman harita konumu belirlenir DISPID (bilgi için sonraki bölüme bakın _ID sürümü DISP_PROPERTY ve DISP_FUNCTION makrolar).

Gelişmiş mfc gönderme eşleme özellikleri

Numarasıyla bu sürümünde Visual C++ ClassWizard desteklemediği ek özellikleri vardır.ClassWizard destekleyen DISP_FUNCTION, DISP_PROPERTY, ve DISP_PROPERTY_EX , tanımladığınız yöntemi, üye değişken özelliğini ve get/set üye işlev özelliği, sırasıyla.Bu yetenekleri genellikle tüm otomasyon sunucularının çoğu oluşturmak için gerekli değildir.

Aşağıdaki makro, desteklenen ClassWizard makrolar yeterli olmadığında kullanılabilir: DISP_PROPERTY_NOTIFY, ve DISP_PROPERTY_PARAM.

DISP_PROPERTY_NOTIFY — Makro tanımı

DISP_PROPERTY_NOTIFY( 
   theClass, 
   pszName, 
   memberName, 
   pfnAfterSet, 
   vtPropType 
)

Notlar

w7a36sdf.collapse_all(tr-tr,VS.110).gifParametreler

  • theClass
    Sınıf adı.

  • pszName
    Dış özelliğin adı.

  • memberName
    Özellik depolanan üye değişkeninin adı.

  • pfnAfterSet
    Üye işlevi özelliği değiştiğinde arama adı.

  • vtPropType
    Özelliğin türünü belirleyen bir değer.

Notlar

Bu makro benzer DISP_PROPERTY, ek bir baðýmsýz deðiþkeni kabul olmasıdır.Ek bir baðýmsýz deðiþkeni, pfnAfterSet, bir şey verir ve herhangi bir parametre 'void OnPropertyNotify()' üye işlevi olmalıdır.Onu adlı sonra üye değişkeni değiştirdi.

DISP_PROPERTY_PARAM — Makro tanımı

DISP_PROPERTY_PARAM( 
   theClass,
   pszName,
   pfnGet,
   pfnSet,
   vtPropType,
   vtsParams 
)

Notlar

w7a36sdf.collapse_all(tr-tr,VS.110).gifParametreler

  • theClass
    Sınıf adı.

  • pszName
    Dış özelliğin adı.

  • memberGet
    Üye işlevi özelliği alma için kullanılan adı.

  • memberSet
    Özelliği ayarlamak için kullanılan üye işlev adı.

  • vtPropType
    Özelliğin türünü belirleyen bir değer.

  • vtsParams
    Bir dize alan vts_ her parametre için ayrılmış.

Notlar

İster çok DISP_PROPERTY_EX makro, makro ayrı Get ve Set üye işlevleri ile erişilen özellik tanımlar.Ancak, bu makro özelliği için bir parametre listesi belirtmenizi sağlar.Bu, başka bir yolla dizine veya parametreli özellikleri uygulamak için yararlıdır.Parametreler her zaman ilk olarak, özelliğin yeni değerini arkasından yerleştirilecek.Örne?in:

DISP_PROPERTY_PARAM(CMyObject, "item", GetItem, SetItem, VT_DISPATCH,    VTS_I2 VTS_I2)

üye işlevler ve karşılık:

LPDISPATCH CMyObject::GetItem(short row, short col)
void CMyObject::SetItem(short row, short col, LPDISPATCH newValue)

DISP_XXXX_ID — Makro tanımları

DISP_FUNCTION_ID( 
   theClass,
   pszName,
   dispid,
   pfnMember,
   vtRetVal,
   vtsParams 
)
DISP_PROPERTY_ID( 
   theClass,
   pszName,
   dispid,
   memberName,
   vtPropType 
)
DISP_PROPERTY_NOTIFY_ID( 
   theClass,
   pszName,
   dispid,
   memberName,
   pfnAfterSet,
   vtPropType 
)
DISP_PROPERTY_EX_ID( 
   theClass,
   pszName,
   dispid,
   pfnGet,
   pfnSet,
   vtPropType 
)
DISP_PROPERTY_PARAM_ID( 
   theClass,
   pszName,
   dispid,
   pfnGet,
   pfnSet,
   vtPropType,
   vtsParams 
)

Notlar

w7a36sdf.collapse_all(tr-tr,VS.110).gifParametreler

  • theClass
    Sınıf adı.

  • pszName
    Dış özelliğin adı.

  • dispid
    Özellik veya yöntem için sabit DISPID.

  • pfnGet
    Üye işlevi özelliği alma için kullanılan adı.

  • pfnSet
    Özelliği ayarlamak için kullanılan üye işlev adı.

  • memberName
    Özelliğe eşleştirmek için üye değişkeni adı

  • vtPropType
    Özelliğin türünü belirleyen bir değer.

  • vtsParams
    Bir dize alan vts_ her parametre için ayrılmış.

Notlar

Bu makroları belirtmenize olanak veren bir DISPID mfc otomatik olarak izin vererek yerine bir atama.Orada makro adı (örn: eklenir dışında bu makroları Gelişmiş aynı ada sahip.DISP_PROPERTY_ID) ve ID parametresi tarafından belirtilen hemen sonrasına pszName parametresi.AFXDISP bakın.Bu makrolar hakkında daha fazla bilgi için h._ID girişleri dağıtma eşlemi sonunda yerleştirilmelidir.Otomatik etkileyecek DISPID olmayan bir şekilde üretimi-_ID makro sürümü olacaktır ( DISPIDs, konuma göre belirlenir).Örne?in:

BEGIN_DISPATCH_MAP(CDisp3DPoint, CCmdTarget)
    DISP_PROPERTY(CDisp3DPoint, "y", m_y, VT_I2)
    DISP_PROPERTY(CDisp3DPoint, "z", m_z, VT_I2)
    DISP_PROPERTY_ID(CDisp3DPoint, "x", 0x00020003, m_x, VT_I2)
END_DISPATCH_MAP()

mfc DISPID değerleri için CDisp3DPoint sınıfını aşağıdaki gibi oluşturur:

property X    (DISPID)0x00020003
property Y    (DISPID)0x00000002
property Z     (DISPID)0x00000001

Belirten bir sabit DISPID önceden varolan dağıtma arabirimi için geri uyumluluğu korumak veya belirli sistem tanımlı yöntemleri veya özellikleri uygulamak için yararlıdır (genellikle negatif gösterilen DISPID, gibi DISPID_NEWENUM koleksiyonu).

w7a36sdf.collapse_all(tr-tr,VS.110).gifCOleClientItem bir IDispatch arabirimi alınıyor

Otomasyon ole sunucusu işlevselliği ile birlikte kendi document nesneleri içinde birçok sunucuları destekler.Bu Otomasyon arabirimi erişmek için doğrudan erişim için gerekli olduğu COleClientItem::m_lpObject üye değişkeni.Aşağıdaki kod alır IDispatch bir nesneyi türetildiği için arabirim COleClientItem.Bu işlevsellik gerekli bulursanız, aşağıdaki kodu uygulamanıza dahil edebilirsiniz:

LPDISPATCH CMyClientItem::GetIDispatch()
{
    ASSERT_VALID(this);
    ASSERT(m_lpObject != NULL);

    LPUNKNOWN lpUnk = m_lpObject;

    Run();    // must be running

    LPOLELINK lpOleLink = NULL;
    if (m_lpObject->QueryInterface(IID_IOleLink, 
        (LPVOID FAR*)&lpOleLink) == NOERROR)
    {
        ASSERT(lpOleLink != NULL);
        lpUnk = NULL;
        if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
        {
            TRACE0("Warning: Link is not connected!\n");
            lpOleLink->Release();
            return NULL;
        }
        ASSERT(lpUnk != NULL);
    }

    LPDISPATCH lpDispatch = NULL;
    if (lpUnk->QueryInterface(IID_IDispatch, &lpDispatch) 
        != NOERROR)
    {
        TRACE0("Warning: does not support IDispatch!\n");
        return NULL;
    }

    ASSERT(lpDispatch != NULL);
    return lpDispatch;
}

Dağıtma arabirimi dönen bu işlevi sonra doğrudan veya bağlı bir COleDispatchDriver tür-güvenli erişim için.Doğrudan kullanmanız durumunda, çağrı emin olun, yayın üye aracılığıyla, işaretçi ( COleDispatchDriver yıkıcı varsayılan olarak yapar).

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar