我有一个 COM 对象。在主要课程中,我创建了两个公共成员。
public:
HANDLE m_hVoiceData;
void* m_pVoiceData;
它们用于映射文件。我在 COM 对象的实例化处映射文件。
COM 对象的主类有一个私有类。从这个私有类我想访问这些公共成员:
这就是我想要访问映射文件的方式:
memcpy(nEncodedBytes,& CTTSEngObj::m_pVoiceData[iFirstByteToRead], iLenCompressedBytes);
但是编译器不喜欢这样。它说“非静态成员引用必须相对于某个对象”。
谁能告诉我如何正确地做到这一点?我知道在主类中公开成员,但我需要这样做,因为私有类(如上所述)也有私有类,它们都需要这个成员来访问某个映射文件。
这是我映射文件的地方:
STDMETHODIMP CTTSEngObj::SetObjectToken(ISpObjectToken * pToken)
{
HRESULT hr = SpGenericSetObjectToken(pToken, m_cpToken);
//--- Map the voice data so it will be shared among all instances
// Note: This is a good example of how to memory map and share
// your voice data across instances.
TCHAR szFileName[MAX_PATH+1];
GetModuleFileName(_Module.m_hInst, szFileName, MAX_PATH+1);
StrCpy(PathFindFileName(szFileName), _T("data.dat"));
if( SUCCEEDED( hr ) )
{
USES_CONVERSION;//needed to make T2W work
hr = MapFile( T2W(szFileName), &m_hVoiceData, &m_pVoiceData );
}
进而
STDMETHODIMP CTTSEngObj::Speak( DWORD dwSpeakFlags,
REFGUID rguidFormatId,
const WAVEFORMATEX * pWaveFormatEx,
const SPVTEXTFRAG* pTextFragList,
ISpTTSEngineSite* pOutputSite )
{
HRESULT hr = S_OK;
//--- Check args
if( SP_IS_BAD_INTERFACE_PTR( pOutputSite ) ||
SP_IS_BAD_READ_PTR( pTextFragList ) )
{
hr = E_INVALIDARG;
return hr;
}
m_App.DoSomething();
m_App 是一个类。它是 COM 对象主类的私有成员。
该类有子类,例如:CTTSEngObj.m_App.SomeSmallClass
SomeSmallClass 需要访问映射的文件。