UPnP APIを操作しようとプログラムを書いていて、単純な間違いで2時間くらいハマりました・・・
IUPnPDeviceFinder::FindByType を使うと、デバイスリストとして IUPnPDevices インターフェースが取得できます。
IUPnPDevices の中身を取得するためには、IUPnPDevices::__NewEnumを使い、 IEnumVARIANT か IEnumUnknown を取得して使います。
私は
IEnumUnknown *pEnumUnknown = NULL;
pUPnPDevices->get__NewEnum((LPUNKNOWN *)&pEnumUnknown);
pEnumUnknown->Next(1, &pDevice, &recv);
と言うコードを書いたのですが、最後のNext()が正常に動作しません。
よく考えたら当たり前で、_NewEnum は、IEnumUnknown では無く IUnknown を返すのだから、次のようにコーディングする必要がありました。
IUnknown *pUnknown=NULL;
pUPnPDevices->get__NewEnum((LPUNKNOWN *)&pUnknown);
IEnumUnknown *pEnumUnknown=NULL;
pUnknown->QueryInterface(IID_IEnumUnknown, (void **)&pEnumUnknown);
pEnumUnknown->Next(1, &pDevice, &recv);
このように、IUnknown から QueryInterface して、IEnumUnknown を取得する必要があります。
よく考えれば、当たり前なんですが・・・
IUPnPDeviceFinder::FindByType を使うと、デバイスリストとして IUPnPDevices インターフェースが取得できます。
IUPnPDevices の中身を取得するためには、IUPnPDevices::__NewEnumを使い、 IEnumVARIANT か IEnumUnknown を取得して使います。
私は
IEnumUnknown *pEnumUnknown = NULL;
pUPnPDevices->get__NewEnum((LPUNKNOWN *)&pEnumUnknown);
pEnumUnknown->Next(1, &pDevice, &recv);
と言うコードを書いたのですが、最後のNext()が正常に動作しません。
よく考えたら当たり前で、_NewEnum は、IEnumUnknown では無く IUnknown を返すのだから、次のようにコーディングする必要がありました。
IUnknown *pUnknown=NULL;
pUPnPDevices->get__NewEnum((LPUNKNOWN *)&pUnknown);
IEnumUnknown *pEnumUnknown=NULL;
pUnknown->QueryInterface(IID_IEnumUnknown, (void **)&pEnumUnknown);
pEnumUnknown->Next(1, &pDevice, &recv);
このように、IUnknown から QueryInterface して、IEnumUnknown を取得する必要があります。
よく考えれば、当たり前なんですが・・・