Bu makalede, Microsoft Visual C++ kullanarak Microsoft Word 97 uygulama olayları catch gösterilmiştir. Ancak, kavram ve bu makaledeki kod Microsoft Word'e özgü değildir; bu tüm grubunun olayları, diğer uygulamaların yanı sıra, Microsoft Office uygulamaları için geçerlidir.
Bir MFC oluşturmak için aşağıdaki adımları göstermek Microsoft Word 97 uygulama olayları Startup() DocumentChange() ve Quit() yakalar uygulama:
MFC kullanarak yeni bir iletişim kutusu-tabanlı uygulama AppWizard. Projenizi WordEvents ad ve varsayılan ayarları kabul edin.
Iletişim kutunuz iki düğme ekleme ve sırasıyla "Ve Kur'u başlatma" ve "çıkın ve yukarı, temizleme" düğmeleri adlandırın.
"Ve Kur'u başlatma" düğmesi için bir işleyicisine aşağıdaki kodu ekleyin:
// Check to see if you've already started the server.
if(m_app.m_lpDispatch != NULL) {
AfxMessageBox("Server already started.");
return;
}
char buf[256]; // General purpose buffer.
// Start Automation server.
COleException e;
if(!m_app.CreateDispatch("Word.Application.8", &e)) {
sprintf(buf, "Error on CreateDispatch(): %ld (%08lx)",
e.m_sc, e.m_sc);
AfxMessageBox(buf, MB_SETFOREGROUND);
return;
}
// Make server visible through automation.
// I.e.: Application.Visible = TRUE
DISPID dispID;
unsigned short *ucPtr;
BYTE *parmStr;
ucPtr = L"visible";
m_app.m_lpDispatch->GetIDsOfNames(
IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
);
parmStr = (BYTE *)( VTS_VARIANT );
m_app.InvokeHelper(
dispID, DISPATCH_METHOD | DISPATCH_PROPERTYPUT, VT_EMPTY,
NULL, parmStr, &COleVariant((short)TRUE)
);
// Declare the events you want to catch.
// {000209F7-0000-0000-C000-000000000046}
static const GUID IID_IWord8AppEvents =
{0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } };
// Steps for setting up events.
// 1. Get server's IConnectionPointContainer interface.
// 2. Call IConnectionPointContainerFindConnectionPoint()
// to find the event you want to catch.
// 3. Call IConnectionPoint::Advise() with the IUnknown
// interface of your implementation of the events.
HRESULT hr;
// Get server's IConnectionPointContainer interface.
IConnectionPointContainer *pConnPtContainer;
hr = m_app.m_lpDispatch->QueryInterface(
IID_IConnectionPointContainer,
(void **)&pConnPtContainer
);
ASSERT(!FAILED(hr));
// Find connection point for events you're interested in.
hr = pConnPtContainer->FindConnectionPoint(
IID_IWord8AppEvents,
&m_pConnectionPoint
);
ASSERT(!FAILED(hr));
// Get the IUnknown interface of your event implementation.
LPUNKNOWN pUnk = m_myEventSink.GetInterface(&IID_IUnknown);
ASSERT(pUnk);
// Setup advisory connection!
hr = m_pConnectionPoint->Advise(pUnk, &m_adviseCookie);
ASSERT(!FAILED(hr));
// Release IConnectionPointContainer interface.
pConnPtContainer->Release();
"Çıkın ve Temizle" düğmesi için bir işleyicisine aşağıdaki kodu ekleyin:
// Check if you've started the server.
if(m_app.m_lpDispatch == NULL) {
AfxMessageBox("You haven't started the server yet.");
return;
}
m_pConnectionPoint->Unadvise(m_adviseCookie);
// Tell server to quit.
// Application.Quit()
DISPID dispID; // Temporary DISPID
unsigned short *ucPtr; // Temporary name holder
ucPtr = L"quit";
m_app.m_lpDispatch->GetIDsOfNames(
IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
);
m_app.InvokeHelper(dispID, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
// Release application object.
m_app.ReleaseDispatch();
MFC ClassWizard (CTRL + W) başlatın ve CCmdTarget ve otomasyon desteğiyle elde edilen yeni sınıf eklemek ("Otomasyon" denetimi seçeneği). Bu sınıf MyEventSink adı; bu bizim uygulaması Microsoft Word ün uygulama olayları.
MFC ClassWizard, otomasyon sekmesini tıklatın ve aşağıdaki üç yöntemden sırada ekleyin:
void Startup()
void Quit()
void DocumentChange()
MyEventSink.cpp içinde görüntülemek için bu yeni yöntemleri uygulamak ne zaman tetiklenir size bildirmek için adlı kutuları iletisi:
MyEventSink.cpp dosyasını ve bildirim IID_IMyEventSink için bulun. ClassWizard arabiriminiz için yeni rasgele bir GUID oluşturulur, ancak bir GUID olan belirli bir arabirimi uygulama için sizin eşleşecek şekilde değiştirmek gerekir. Bildirim için IID_IMyEventSink şu şekilde değiştirin: statik const GUID IID_IMyEventSink = {0x000209f7, <a2>0x000</a2>, <a4>0x0000, {0xc0, 0x00, 0x0, 0x00, 0x00, 0x00, 0x00, 0x46}};
Aşağıdaki değişkenleri ortak üye WordEventsDlg sınıfınızda WordEventsDlg.h ekleyin:
Kod satırlarını gibi görünmesini sağlayacak şekilde bu bildirimi, yukarıdaki "Korumalı" sözcüğü taşımak:
virtual ~MyEventSink();
// Implementation
protected:
// virtual ~MyEventSink(); // Or this line may be removed.
Son olarak, OLE/COM kitaplığı başlatılamadı olanağı elde emin olun. Aşağıdaki kodu sağa önce "Ve Kur'u başlatma" düğmesini işleyicisi ekleyin. Bu uygulama başlatma sırasında oluşturulan alır ve çıkış sırasında zarar genel bir sınıfı oluşturur. Kurucu ve bu sınıfın bir yıkıcı başlatma ve temizleme işlemleri için kullanışlı bir yol sağlar:
// Ole-initialization class.
class OleInitClass {
public:
OleInitClass() {
OleInitialize(NULL);
}
~OleInitClass() {
OleUninitialize();
}
};
// This global class calls OleInitialize() at
// application startup, and calls OleUninitialize()
// at application exit.
OleInitClass g_OleInitClass;
Derleyin ve çalıştırın.
Uygulamayı çalıştırdıktan sonra Microsoft Word'Ü başlatın ve olay bildirimleri "başlatın ve kurulum" düğmesini tıklatın. Microsoft Word'de, yeni bir belge oluşturmak için YeniDosya</a0> menüsünde tıklatın. Bilgisayarınızı DocumentChange() olayını harekete geçirdi. Başka bir belge açın ve etkinleştirme bir belgeden diğerine geçtiğinizde, ayrıca harekete, dikkat edin. Olay bildirimlerini durdurmak ve Microsoft Word'den çıkar "çıkın ve temizleme ara" düğmesini tıklatabilir ya da Microsoft Word'den Exit (Dosya menüsünden Çıkış ' ı tıklatın) ve çıkış bildirim dikkat edin.
Başlangıç olay hiçbir zaman tetiklenir farkedebilirsiniz. Olayları ayarlamadan önce harekete geçirildi olmasıdır. Yok gerçekten Not uygulama önce başlatılmış gerekir, çünkü bu olay, işlemek için bir neden arayın ve otomasyon yöntemlerini ve özelliklerini ayarlayın.
Microsoft Excel'in birçok ilginç ve yararlı olay destekler ve bunları yakalamak için burada adımları izleyebilirsiniz. Ancak, anımsamak birkaç nokta vardır:
Microsoft Visual C++ 5.0 ilgilendiğiniz sunucusunun Tür Kitaplığı'nı görüntülemek için gelen OLE/COM nesnesi görüntüleyiciyi kullanın. Bulmak için olayları coclass bildirimleri (genellikle pencerenin altındaki ağaç) açın; her coclass ilişkili olayları listelenir. Hangi olayların kullanılabilir olup olmadığını görmek bir olay arabirimini, kendi DISPIDs ve nasıl, sağdaki görünümündeki bildirilen tıklattığınızda.
Microsoft Word ün uygulama olayları, Startup() Quit() ve DocumentChange() DISPIDs 1, 2 ve 3 sırasıyla olmadığı için bizim bizim MyEventSink sınıfı yöntemleri DISPIDs değiştirmek gerekli değildi. Bu yöntemler, sırayla oluşturursanız, bunları ClassWizard DISPID 1 başladığından, tür kitaplığı eşleşecek şekilde değiştirmek gerekmez. Ancak, çoğu olayları için Microsoft Excel'in çalışma kitabını olayları gibi DISPID 1 ile başlatmayın. Bu gibi durumlarda, açıkça DISPIDs doğru yöntemleri ile eşleşecek şekilde MyEventSink.cpp gönderme eşlemesinde değiştirmeniz gerekir.
Oluşturma hakkında daha fazla bilgi için arabirimler batar ve bağlantı işlemini basitleştirerek, Microsoft Bilgi Bankası'ndaki görüntülemek üzere aşağıdaki makale numarasını tıklatın:
181845
(http://support.microsoft.com/kb/181845/
)
Nasıl YAPıLıR: MFC tabanlı COM istemcisi'nde bir havuz arabirimi oluştur.
Genel bir örneği ve hakkında daha fazla bilgi için bağlantı noktaları için Microsoft Bilgi Bankası'ndaki aşağıdaki makalede açıklanan Connpts.exe örnek bakın:
152087
(http://support.microsoft.com/kb/152087/
)
MFC uygulamaları üzerinde Connpts.exe ımplements bağlantı noktaları
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:183599
(http://support.microsoft.com/kb/183599/en-us/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.