Контрольная работа: Распределенная обработка данных
// Создать компонент
IUnknown* pIUnknown = CreateInstance();
// Получить интерфейс IX
IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
// Завершить работу с IUnknown
pIUnknown->Release();
// Использовать IX, если он был получен успешно
if (SUCCEEDED(hr))
{
pIX->Fx(); // Использовать интерфейс IX
pIX->Release(); // Завершить работу с IX
}
Легко забыть, что всякий раз, когда Вы копируете указатель на интерфейс, надо увеличить его счетчик ссылок. В приведенном далее фрагменте кода делается еще одна ссылка на интерфейс IX. В общем случае необходимо увеличивать счетчик ссылок всякий раз, когда создается копия указателя на интерфейс, о чем говорит приведенное выше правило 3.
// Создать компонент
IUnknown* pIUnknown = CreateInstance();
IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
pIUnknown->Release();
if (SUCCEEDED(hr))
{
pIX->Fx(); // Использовать интерфейс IX
IX* pIX2 = pIX; // Создать копию pIX
pIX2->AddRef(); // Увеличить счетчик ссылок
pIX2->Fx(); // Что-то делать при помощи pIX2
pIX2->Release(); // Завершить работу с pIX2
pIX->Release(); // Завершить работу с pIX
}
Клиент сообщает компоненту о своем желании использовать интерфейс, когда вызывается