ここに例があります: http://www.chrisnet.net/code.htmCLSID_DirectSoundPrivate
はインターフェイスの使用方法を示しています。 、この例以外では説明されていない複数の呼び出しを含むひどいインターフェースを持っています。
この例を取り上げたGet
ところ、プロパティ セットでメソッドを呼び出そうとすると、スタック違反が発生しました。
IKsPropertySet
direct show は同じインターフェイスを同じ GUID で定義しているが、異なる vtable を使用している#include
dshow.h
ことが判明しましstrmif.h
たdsound.h
。言うまでもなく、私は感動していません。
必要な呼び出しは次のとおりです。
hr = pKsPropertySet->Get(DSPROPSETID_DirectSoundDevice,
DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION,
NULL,
0,
&sDirectSoundDeviceDescription,
sizeof(sDirectSoundDeviceDescription),
&ulBytesReturned
);
if (ulBytesReturned)
{
// On the first call it notifies us of the required amount of memory in order to receive the strings.
// Allocate the required memory, the strings will be pointed to the memory space directly after the struct.
psDirectSoundDeviceDescription = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA)new BYTE[ulBytesReturned];
*psDirectSoundDeviceDescription = sDirectSoundDeviceDescription;
hr = pKsPropertySet->Get(DSPROPSETID_DirectSoundDevice,
DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION,
NULL,
0,
psDirectSoundDeviceDescription,
ulBytesReturned,
&ulBytesReturned
);