Verwenden einer COM-Schnittstelle
Der Clientcode ist der Benutzer der COM-Schnittstelle. Um eine beliebige BENUTZERDEFINIERTE ODER STANDARD-COM-Schnittstelle verwenden zu können, muss ein Client seine IID kennen. Im folgenden Beispiel übergibt der Treiber, der CustomRpt aufruft, den Namen des Objekts, das in ein Breitzeichenformat konvertiert wird. Der Objektname wird an CreateFileMoniker gespeist, sodass ein Dateimoniker erstellt und der Client an das ausgeführte Objekt gebunden werden kann. Nachdem das Objekt ausgeführt wurde, kann CustomRpt entweder auf einen Zeiger auf eine Schnittstelle im Standardproxy/Stub wie IPersistFileoder auf die benutzerdefinierte Schnittstelle ICustomInterface zugreifen.
void CustomRpt(char *pszObject)
{
HRESULT hr;
WCHAR wszObject[128];
WCHAR wszMsg[128] = {L"Your Message Here...\n"};
IMoniker *pmkObject = NULL;
IUnknown *pIUnk = NULL;
IPersistFile *pIPersistFile = NULL;
ICustomInterface *pICustomInterface = NULL;
// Create a wide-character version of the object's file name.
StringCchPrintf(wszObject, 128, L"%hs", pszObject);
// Get a file moniker for the object (a *.smp file).
hr = CreateFileMoniker(wszObject, &pmkObject);
if(FAILED(hr))
{
printf("Client: CreateFileMoniker for Object failed");
return;
}
// BindMoniker is equivalent to calling CreateBindCtx() followed by
// a call to BindToObject(). It has the net result of binding the
// interface (specified by the IID) to the moniker.
hr = BindMoniker(pmkObject, 0, IID_IUnknown, (void **)&pIUnk);
if (FAILED(hr))
{
printf("Client: BindMoniker failed (%x)\n", hr);
return;
}
// Try a couple QueryInterface calls into the object code; first a
// QueryInterface to IPersistFile...
hr = pIUnk->QueryInterface(IID_IPersistFile, (void **)&pIPersistFile);
if (FAILED(hr)) {
printf("Client: QueryInterface IPersistFile failed (%x)\n", hr);
pIUnk->Release();
return;
}
// Followed by a QueryInterface to ICustomInterface.
hr = pIUnk->QueryInterface(IID_ICustomInterface, (void **)&pICustomInterface);
if (FAILED(hr)) {
printf("Client: QueryInterface failed (%x)\n", hr);
pIUnk->Release();
pIPersistFile->Release();
return;
}
// CustomReport() is the object function that displays the time and
// date information on the object.
hr = pICustomInterface->CustomReport();
if (FAILED(hr))
{
printf("Client: pICustomInterface->CustomReport failed (%x)\n", hr);
pIUnk->Release();
pIPersistFile->Release();
return;
}
// Clean up resources by calling release on each of the interfaces.
pIPersistFile->Release();
pICustomInterface->Release();
pIUnk->Release();
return;
}