I create a COM object IWMReader, this object need add Callback, like this
ReaderCallback::OnSample
I don't know to add these by BCB2007
My code like these
TComInterface<IWMReader> m_pReader;
TComInterface<IWMReaderCallback> ReaderCallback;
HRESULT hr = m_pReader->Open( L"Test.mp3", ReaderCallback, NULL );
Please tell me how to manipulate IWMReader and IWMReaderCallback by BCB2007.
Thanks for any comments.
Best regards,
James
> Please tell me how to manipulate IWMReader and IWMReaderCallback by
> BCB2007.
> Thanks for any comments.
>
Does adding & before ReaderCallback help?
I need add ReadCallBack::OnSample on my project for receive this callback
message, but I can not find any sample code manipulate by BCB2007.
I declare the call back function on header file, but I don't know how to
manipulate these call back function.
I copy some code from MS Media Format SDK Audioplay sample code.
//
// Methods of IWMReaderCallback
//
HRESULT STDMETHODCALLTYPE OnStatus( /* [in] */ WMT_STATUS Status,
/* [in] */ HRESULT hr,
/* [in] */ WMT_ATTR_DATATYPE dwType,
/* [in] */ BYTE __RPC_FAR *pValue,
/* [in] */ void __RPC_FAR *pvContext );
HRESULT STDMETHODCALLTYPE OnSample( /* [in] */ DWORD dwOutputNum,
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR *pSample,
/* [in] */ void __RPC_FAR *pvContext );
Thanks for your response.
Best regards,
James
"Alex Bakaev [TeamB]" <zx...@att.net> 在郵件
news:47fa5d09$1...@newsgroups.borland.com 中撰寫...
Well, the code should be identical, no matter what compiler you are using.
Please provide me example about manipulate COM object add Callback interface
with OnSample mothod.
Thanks for your reponse.
Best regards,
James
"Alex Bakaev [TeamB]" <zx...@att.net> 在郵件
news:47fa6e78$1...@newsgroups.borland.com 中撰寫...
Great, that's good example for me.
Best regards,
James
> I create a COM object IWMReader, this object need add
> Callback, like this ReaderCallback::OnSample
>
> I don't know to add these by BCB2007
You need to write a new class that derives from the IWMReaderCallback
interface, implementing all of its methods (including the ones from
IWMStatusCallback and IUnknown as well), or example (untested):
class TMyWMReaderCallback : public IWMReaderCallback
{
private:
ULONG FRefCnt;
public:
TMyWMReaderCallback();
// IUnknown
HRESULT __stdcall QueryInterface(REFIID riid, void** pv);
ULONG __stdcall AddRef();
ULONG __stdcall Release();
// IWMStatusCallback
HRESULT __stdcall OnStatus(WMT_STATUS Status, HRESULT hr,
WMT_ATTR_DATATYPE dwType, BYTE* pValue, void* pvContext);
// IWMReaderCallback
HRESULT __stdcall OnSample(DWORD dwOutputNum, QWORD cnsSampleTime,
QWORD cnsSampleDuration, DWORD dwFlags, INSSBuffer* pSample, void*
pvContext);
};
TMyWMReaderCallback::TMyWMReaderCallback()
: FRefCnt(0)
{
}
HRESULT __stdcall TMyWMReaderCallback::QueryInterface(REFIID riid,
void** pv)
{
if( !pv )
return E_POINTER;
*pv = NULL;
if( IsEqualIID(riid, IID_IWMReaderCallback) )
*pv = (IWMReaderCallback*) this;
else if( IsEqualIID(riid, IID_IWMStatusCallback )
*pv = (IWMReaderCallback*) this;
else if( IsEqualIID(riid, IID_IUnknown) )
*pv = (IUnknown*) (IWMReaderCallback*) this;
if( *pv == NULL )
return E_NOINTERFACE;
AddRef();
return S_OK;
}
ULONG __stdcall TMyWMReaderCallback::AddRef()
{
return ++FRefCnt;
}
ULONG __stdcall TMyWMReaderCallback::Release()
{
if( --FRefCnt == 0 )
{
delete this;
return 0;
}
return FRefCnt;
}
HRESULT __stdcall TMyWMReaderCallback::OnStatus(WMT_STATUS Status,
HRESULT hr, WMT_ATTR_DATATYPE dwType, BYTE* pValue, void* pvContext)
{
// do something...
return S_OK;
}
HRESULT __stdcall TMyWMReaderCallback::OnSample(DWORD dwOutputNum, QWORD
cnsSampleTime, QWORD cnsSampleDuration, DWORD dwFlags, INSSBuffer* pSample,
void* pvContext)
{
// do something...
return S_OK;
}
Then you can do the following:
{
TComInterface<IWMReader> m_pReader;
// instantiate m_pReader as needed, then...
TComInterface<IWMReaderCallback> ReaderCallback(new
TMyReaderCallback, true);
HRESULT hr = m_pReader->Open( L"Test.mp3", ReaderCallback, NULL );
//...
}
Gambit