Het is gebruikelijk voor een OLE-besturingselement moet de IDispatch van de container. U
vind de IDispatch vaak met QueryInterface() uit onmiddellijk
toegankelijke interfaces op de server, zoals IOleClientSite. Echter, voor
Sommige servers, zoals Microsoft Excel, mislukt deze methode.
Een andere manier om de IDispatch is met behulp van de API voor GetActiveObject()
de server IDispatch ophalen uit de ROT. Deze methode vereist echter dat
u moet de CLSID of ProgID van de server verkrijgen. Voorts
Dubbelzinnige situaties kunnen zich voordoen wanneer u geen onderscheid maken tussen meerdere
exemplaren van de server.
In dit artikel wordt een andere benadering de IDispatch die werkt voor
Microsoft Excel en Microsoft Word, zelfs als meerdere exemplaren
uitgevoerd.
De onderstaande stappen kunnen u een besturings element dat u kunt bouwen de
IDispatch van het container Document-object.
Dit is de implementatie van gegevens, meestal alle van de implementatie van de standaard-COleControl gegevens, met uitzondering van SetHostNames() aanroepen delegeert. U SetHostNames() trap en opslaan van de naam van het document waar u het besturings element wordt ingevoegd.
Helaas aanroepen geen Microsoft PowerPoint deze methode, zodat dit voorbeeld niet met dit product werkt. Microsoft Powerpoint is echter een single-instance server, zodat u GetActiveObject() gebruiken kan om unieke IDispatch-pointer.
Het volgende lidfuncties toevoegen aan uw klasse die is afgeleid van COleControl:
void COffCntrDispCtrl::GetDocDispatch()
{
// No need, if we already have it.
if(m_pDocDisp != NULL) return;
// Get a BindCtx.
IBindCtx *pbc;
HRESULT hr = CreateBindCtx(0, &pbc);
if(FAILED(hr)) {
DoErr("CreateBindCtx()", hr);
return;
}
// Get running-object table.
IRunningObjectTable *prot;
hr = pbc->GetRunningObjectTable(&prot);
if(FAILED(hr)) {
DoErr("GetRunningObjectTable()", hr);
pbc->Release();
return;
}
// Get enumeration interface.
IEnumMoniker *pem;
hr = prot->EnumRunning(&pem);
if(FAILED(hr)) {
DoErr("EnumRunning()", hr);
prot->Release();
pbc->Release();
return;
}
// Start at the beginning.
pem->Reset();
// Churn through enumeration.
ULONG fetched;
IMoniker *pmon;
int n = 0;
while(pem->Next(1, &pmon, &fetched) == S_OK) {
// Get DisplayName.
LPOLESTR pName;
pmon->GetDisplayName(pbc, NULL, &pName);
// Convert it to ASCII.
char szName[512];
WideCharToMultiByte(CP_ACP, 0, pName, -1, szName, 512, NULL,
NULL);
// Compare it against the name we got in SetHostNames().
if(!strcmp(szName, m_szDocName)) {
DoMsg("Found document in ROT!");
// Bind to this ROT entry.
IDispatch *pDisp;
hr = pmon->BindToObject(pbc, NULL, IID_IDispatch, (void
**)&pDisp);
if(!FAILED(hr)) {
// Remember IDispatch.
m_pDocDisp = pDisp;
// Notice...
sprintf(buf, "Document IDispatch = %08lx",
m_pDocDisp);
DoMsg(buf);
}
else {
DoErr("BindToObject()", hr);
}
}
// Release interfaces.
pmon->Release();
// Break out if we obtained the IDispatch successfully.
if(m_pDocDisp != NULL) break;
}
// Release interfaces.
pem->Release();
prot->Release();
pbc->Release();
}
void COffCntrDispCtrl::TestDispatch()
{
ASSERT(m_pDocDisp);
COleDispatchDriver doc(m_pDocDisp);
DISPID dispID = 0;
unsigned short *ucPtr = L"Name";
// Get DISPID for Name.
HRESULT hr = m_pDocDisp->GetIDsOfNames(IID_NULL, &ucPtr, 1,
LOCALE_USER_DEFAULT, &dispID);
ASSERT(!FAILED(hr));
// Get Name property.
CString name;
doc.GetProperty(dispID, VT_BSTR, &name);
AfxMessageBox(
CString("Document name is ") + name,
MB_SETFOREGROUND
);
}
Compilatie!
Voer de volgende stappen voor uw besturings element testen in Microsoft Excel 97:
Start Microsoft Excel 97.
Brengen van deWerkset besturings elementenwerkbalk (op deWeergavemenu, klikt u opWerk balken).
Klik op het uiterst rechts hamer & moer sleutel pictogram in deWerkset besturings elementenwerkbalk
en selecteer het nieuwe besturings element; het moet OffCntrDisp worden aangeroepen.
Teken een rechthoek in het werk blad invoegen van het besturings element.RESULTATEN: U ziet de
besturings element wordt weer gegeven, en kort daarna een berichtvenster met gevonden"
document in ROT." Vervolgens moet er een ander bericht vak weer
iets dergelijks te "Document IDispatch = 0043bf8c." Tot slot, als u
verschijnt een berichtvenster waarin u de naam van het document waarbij
deze is ingevoegd.
Volgende stappen volgen om te testen uw controle in Microsoft Office Excel 2007:
Excel 2007 start.
Klik op deOntwikkelaartabblad.
Als deOntwikkelaartabblad niet wordt weer gegeven op het lint, volgt het tabblad inschakelen:
Klik op deMicrosoft Office-knop, en klik vervolgens opOpties voor Excel.
Klik op dePopulairetabblad en klik vervolgens op deTabblad ontwikkelaars op het lint weer gevenselectie vakje.
Klik opOK.
In deBesturings elementengroep op deOntwikkelaaren klik opInvoegen.
In deMeer besturings elementenhet dialoog venster, klikt u opOffCntrDisp.
Teken een rechthoek in het werk blad invoegen van het besturings element.RESULTATENHet besturings element wordt weer gegeven. Kort daarna een berichtvenster met "Document gevonden in ROT" wordt weer gegeven. Vervolgens moet er een ander berichtvenster dat lijkt op "Document IDispatch = 0043bf8c." Ten slotte ziet u een berichtvenster waarin wordt gemeld dat u de naam van het document waarin deze is ingevoegd.
Artikel ID: 190985 - Laatste beoordeling: zaterdag 26 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
Microsoft Visual C++ 5.0 Enterprise Edition
Microsoft Visual C++ 5.0 Professional Edition
Microsoft Office Word 2007
Microsoft Word 2000 Standard Edition
Microsoft Office Excel 2007
Microsoft Excel 2002 Standard Edition
Microsoft Excel 2000 Standard Edition
Microsoft Excel 97 Standard Edition
Trefwoorden:
kbautomation kbhowto kbmt KB190985 KbMtnl
Automatische vertaling
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:190985
Hoeveel moeite hebt u persoonlijk moeten doen om dit artikel te gebruiken?
Heel weinig
Weinig
Gemiddeld
Veel
Heel veel
Vertel ons waarom en wat we kunnen doen om de informatie te verbeteren
Dank u! Uw feedback wordt gebruikt om ons te helpen onze inhoud voor ondersteuning te verbeteren. Bezoek de Startpagina voor Hulp en ondersteuning voor meer assistentieopties.