Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How add callback function to IWMReader COM object

10 views
Skip to first unread message

James5950

unread,
Apr 7, 2008, 1:24:39 PM4/7/08
to
Dear All,

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

Alex Bakaev [TeamB]

unread,
Apr 7, 2008, 1:42:34 PM4/7/08
to
James5950 wrote:

> Please tell me how to manipulate IWMReader and IWMReaderCallback by
> BCB2007.
> Thanks for any comments.
>


Does adding & before ReaderCallback help?

James5950

unread,
Apr 7, 2008, 2:00:53 PM4/7/08
to
Hello Alex,

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 中撰寫...

Alex Bakaev [TeamB]

unread,
Apr 7, 2008, 2:56:57 PM4/7/08
to
James5950 wrote:
> Hello Alex,
>
> I need add ReadCallBack::OnSample on my project for receive this
> callback message, but I can not find any sample code manipulate by BCB2007.
>

Well, the code should be identical, no matter what compiler you are using.

James5950

unread,
Apr 7, 2008, 3:16:01 PM4/7/08
to
Hello Alex,

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 中撰寫...

James5950

unread,
Apr 7, 2008, 3:27:29 PM4/7/08
to
Hello Remy,

Great, that's good example for me.

Best regards,

James

Remy Lebeau (TeamB)

unread,
Apr 7, 2008, 3:18:29 PM4/7/08
to

"James5950" <Ja...@1come.com.tw> wrote in message
news:47fa...@newsgroups.borland.com...

> 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


0 new messages