【发布时间】:2013-03-25 02:41:00
【问题描述】:
我有一个 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 需要访问映射的文件。
【问题讨论】:
-
请显示更多代码
-
"COM 对象的主类有一个私有类"。这到底是什么意思呢?你有一个嵌套类?
-
这不是真正的 C++...:P
标签: c++ winapi com file-mapping