COM オブジェクトがあります。メイン クラスでは、2 つのパブリック メンバーを作成しました。
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 はマップされたファイルにアクセスする必要があります。