TN039: mfc/ole Otomasyon uygulaması

Ole IDispatch arabirimi genel bakış

IDispatch arabirimi hangi uygulamalara maruz yöntemleri ve özellikleri gibi Visual BASIC ya da diğer diller gibi diğer uygulamalar yapabilirsiniz demektir uygulamanın özelliklerini kullanmaktır. Bu arabirimin en önemli bölümü IDispatch::Invoke işlevidir. mfc kullanır "Haritaları gönderme" IDispatch::Invokeuygulamak. Düzen veya sizin CCmdTarget"şekli" mfc uygulaması bilgi gönderme harita sağlar-öyle ki bunu doğrudan nesnesinin özelliklerini yönetmek veya üye arama işlevleri IDispatch::Invoke isteklerini karşılamak için nesne içinde sınıflar, elde edilen.

Çoğunlukla, ClassWizard ve mfc çoğu ole Otomasyonu uygulama programcısı dan ayrıntılarını gizlemek için işbirliği. Programcı uygulamada etmede gerçek işlevlerini odakları ve temel sıhhi tesisat hakkında endişelenmenize gerek yok.

Ancak, mfc perde arkasında ne anlamak için gerekli olduğu durumlar vardır. Bu Not için üye işlevler ve özellikler çerçevesinde DISPIDs nasıl atar adresi olacaktır. Uygulama nesneleri için bir "tür kitaplığı" oluşturduğunuzda gibi kimlikleri, bilmeniz gereken bilgi mfc DISPIDs atamak için kullandığı algoritma yalnızca gerekli olduğunda.

Mfc DISPID atama

Özellikleri ve yöntemleri (örneğin obj. kendi kodundaki otomasyon otomasyon (Visual Basic kullanıcı, örneğin), son kullanıcı gördüğü halde gerçek adlarını etkinShowWindow), IDispatch::Invoke uygulanması gerçek adlarını almaz. Optimizasyon nedeniyle, "yöntem veya erişilmesini özelliği tanımlayan bir 32-bit sihirli çerez" olan bir DISPID, aldığı. Bu DISPID değerleri IDispatch uygulaması IDispatch::GetIDsOfNamesadlı başka bir yöntem döndürülür. Otomasyon istemci uygulama, GetIDsOfNames bir kez her üye veya özellik erişmek için düşündüğü için arama ve onları sonraki aramalar için IDispatch::Invokeönbellek. Bu şekilde, pahalı dize arama yalnızca bir kez başına IDispatch::Invoke çağrı başına bir kez yerine nesne kullanımı yapılır.

Mfc DISPIDs her yöntemi ve iki şey temel özelliği belirler:

DISPID iki bölüme ayrılmıştır. İlk bileşen, dağıtım haritanın üst mesafe DISPID , loword içerir. HIWORD mesafe en türetilmiş bir sınıf içerir. Örneğin:

cDispPoint sınıfı: Genel CCmdTarget
{
public:
 nbsp;  kısa m_x, m_y;
    ...
    DECLARE_DISPATCH_MAP()
    ...
};

CDisp3DPoint sınıfı: Genel CDispPoint
{
public:
    kısa m_y;
    ...
    DECLARE_DISPATCH_MAP()
    ...
};

BEGI&N_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 her ikisi de ole Otomasyon arabirimleri maruz iki sınıf vardır. Bu sınıfların diğer türetilmiştir ve böylece ole Otomasyon bölümü de dahil olmak üzere temel sınıfın işlevlerini güçlendirir ("x" ve "y" özellikleri bu durumda).

Mfc DISPIDs sınıfı CDispPoint aşağıdaki gibi oluşturur:

özellik X    (DISPID) 0X00000001
özellik y (DISPID) 0x00000002

Özellikleri bir taban sınıfta değil çünkü DISPID , HIWORD her zaman (en türetilmiş bir sınıf için CDispPoint mesafe sıfırdır) sıfırdır.

Mfc DISPIDs sınıfı CDisp3DPoint aşağıdaki gibi oluşturur:

özellik Z    (DISPID) 0X00000001
özellik x (DISPID) 0x00010001
özellik y (DISPID) 0x00010002

Hangi özellikleri, CDisp3DPoint sunduğu sınıfında tanımlanır çünkü z özelliğinin bir DISPID ile bir sıfır HIWORD verilir. x ve y özelliklerini base sınıfında tanımlanmış beri bu özellikleri içinde tanımlanan sınıfın en türetilmiş bir sınıf gelen bir türetme uzaklıkta olduğundan DISPID , HIWORD 1 ' dir.

&Notnbsp;  Girdileri göster açık DISPID ile varsa bile loword her zaman harita konumu belirlenir (bkz: bilgi için sonraki bölüme, DISP_PROPERTY ve DISP_FUNCTION makroları _ID sürümleri).

Mfc Dispatch harita özellikleri gelişmiş

ClassWizard tarafından desteklenmeyen ek özellikleri bir dizi Visual C++'ın bu sürümü ile vardır. ClassWizard, DISP_FUNCTION, DISP_PROPERTYve DISP_PROPERTY_EX yöntemi, üye değişken özelliğini ve get/set üye işlev özelliği, sırasıyla tanımlayan destekler. Bu yetenekler genellikle tüm otomasyon sunucularının çoğu oluşturmak için gerekli olan.

Aşağıdaki makro ClassWizard desteklenen makroları yeterli olmadığı durumlarda kullanılabilir: DISP_PROPERTY_NOTIFYve DISP_PROPERTY_PARAM.

DISP_PROPERTY_NOTIFY — Makronun açıklama

DISP_PROPERTY_NOTIFY (ardından, pszName, üye adı, pfnAfterSet, vtPropType)

ardından

Sınıf adı.

pszName

Dış ad özelliği.

üye adı

Özellik depolandığı üye değişken adı.

pfnAfterSet

Üye işlev özelliği değiştiğinde arama adı.

vtPropType

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

&Notnbsp;  Ek bir ba?ymsyz de?i?keni kabul ettiği bu makro DISP_PROPERTY, benzer olmasıdır. Ek argüman pfnAfterSet, hiçbir şey verir ve herhangi bir parametre, 'geçersiz OnPropertyNotify()' alır bir üye işlev olmalıdır. Üye değişkeni değiştirilmiş sonra çağrılacak.

DISP_PROPERTY_PARAM — Makronun açıklama

DISP_PROPERTY_PARAM (ardından, pszName, pfnGet, pfnSet, vtPropType, vtsParams)

ardından

Sınıf adı.

pszName

Dış ad özelliği.

memberGet

Özelliği elde etmek için kullanılan üye işlev 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ış.

&Notnbsp;  Çok DISP_PROPERTY_EX makro gibi bu 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 şekilde dizine veya parametreli özellikleri uygulamak için yararlıdır. Parametreler özelliğin yeni değerini ardından her zaman ilk olarak yerleştirilir. Örneğin:

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

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

LPDISPATCH CMyObject::GetItem(short row, short col)
void CMyObject::SetItem (kısa satır, kısa col, LPDISPATCH newValue)

DISP_XXXX_ID — Makro tanımları

DISP_FUNCTION_ID (ardından, pszName, DISPID, pfnMember, vtRetVal, vtsParams)

DISP_PROPERTY_ID (ardından, pszName, DISPID, ÜyeAdı, vtPropType)

DISP_PROPERTY_NOTIFY_ID (ardından, pszName, DISPID, ÜyeAdı, pfnAfterSet, vtPropType)

DISP_PROPERTY_EX_ID (ardından, pszName, DISPID, pfnGet, pfnSet, vtPropType)

DISP_PROPERTY_PARAM_ID (ardından, pszName, DISPID, pfnGet, pfnSet, vtPropType, vtsParams)

ardından

Sınıf adı.

pszName

Dış ad özelliği.

dispid

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

pfnGet

Özelliği elde etmek için kullanılan üye işlev adı.

pfnSet

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

üye adı

Özelliğe eşlenecek üye değişken adı

vtPropType

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

vtsParams

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

&Notnbsp;  Bu makrolar, otomatik olarak bir ata mfc izin vermektense içinde DISPID belirtmenize olanak verir. Bu makroları Gelişmiş have the same names dışında bu kimliği makro (e.g. DISP_PROPERTY_ID) eklenir ve sonra sadece pszName parametresi belirtilen parametre kimliği saptanır. Bkz. AFXDISP.H bu makrolar hakkında daha fazla bilgi. _ID girişleri gönderme harita sonuna yerleştirilmelidir. Aynı şekilde olmayan bir otomatik DISPID üretimi etkiler -_ID yorum-in makro istiyorsunuz ( DISPIDs konuma göre belirlenir). Örneğin:

BEGI&N_DISPATCH_MAP (CDisp3DPoint, CCmdTarget)
 nbsp;  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 için sınıf CDisp3DPoint gibi DISPIDs oluşturacak:

özellik X    (DISPID) 0X00020003
özellik y (DISPID) 0x00000002
özellik z (DISPID) 0x00000001

Bir sabit DISPID belirtme yöntemleri veya özellikleri (bir negatif DISPID, DISPID_NEWENUM koleksiyonu gibi genellikle belirtilir) geriye dönük uyumluluk önceden varolan bir dağıtma arabirimi veya belirli bir sistemin uygulanması için tanımlanan korumak kullanışlıdır.

Bir COleClientItem IDispatch arabirimi alınıyor

Birçok sunucu otomasyon içinde onların belge nesneleri ole sunucusu işlevselliği destekler. Bu Otomasyon arabirimi erişmek için COleClientItem::m_lpObject üye değişkeni doğrudan erişmek gereklidir. Aşağıdaki kod, COleClientItemtüretilen nesne IDispatch arabirimi alır. Bu işlevsellik gerekli bulursanız uygulamanızda aşağıdaki kodu içerebilir.

LPDISPATCH CMyClientItem::GetIDispatch()
{
 nbsp;  ASSERT_VALID(this);
    assert (m_lpObject! = null);

lpunknown lpUnk = m_lpObject;

Run();    / / çalışmalıdır

LPOLELINK lpOleLink = null;
    Eğer (m_lpObject - > QueryInterface (IID_IOleLink, (LPVOID far *) & lpOleLink) noerror ==)
    {
        assert (lpOleLink! = null);
        lpUnk = null;
        Eğer (lpOleLink - > GetBoundSource(&lpUnk)! = noerror)
        {
            TRACE0 ("Uyarı: bağlantı bağlı değil! \n");
            lpOleLink - > Release();
            null döndürür;
        }
        assert (lpUnk! = null);
    }

LPDISPATCH lpDispatch = null;
    Eğer (lpUnk - > QueryInterface (IID_IDispatch & lpDispatch)! = noerror)
    {
        TRACE0 ("Uyarı: IDispatch desteklemiyor! \n");
        null döndürür;
    }

assert (lpDispatch! = null);
    return lpDispatch;
}

Dağıtma arabirimi dönen bu işlevi sonra doğrudan veya tür-güvenli erişim için bir COleDispatchDriver bağlı. Doğrudan kullanıyorsanız, sürüm üye arama emin olun ne zaman aracılığıyla ( COleDispatchDriver yıkıcı yapar bu varsayılan) işaretçi.

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index