大家好:
以下是一个SAPI(微软的语音识别工具)中的例子函数,其实现提取一个filename.txt文件中的内容(有点长,麻烦大家看看):
HRESULT speechconf::GetTextFile(
WCHAR ** ppwszCoMem,//其中*ppwszCoMem 返回文件中的内容,
ULONG * pcch) //为缓存的大小
{
TCHAR pszFileName[_MAX_PATH];//
OPENFILENAME ofn;
HRESULT hr = S_OK;
HANDLE hf = INVALID_HANDLE_VALUE;
DWORD cBytes;
BOOL fUnicodeFile = FALSE;
USHORT uTemp;
WCHAR * pwszCoMem = 0;
ULONG cch = 0;
DWORD dwRead;
size_t ofnsize = (BYTE*)&ofn.lpTemplateName + sizeof(ofn.lpTemplateName) - (BYTE*)&ofn; if (SUCCEEDED(hr))
{
pszFileName[0] = 0; ofn.lStructSize = ofnsize;
ofn.hwndOwner = m_speechconfDlg;
ofn.hInstance = m_hInstance;
ofn.lpstrFilter = _T("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0");
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = pszFileName;
ofn.nMaxFile = _MAX_PATH;
ofn.nMaxFileTitle = _MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
ofn.lpstrDefExt = _T("txt"); hr = GetOpenFileName(&ofn) ? S_OK : E_FAIL;
} if (SUCCEEDED(hr))
{
hf = CreateFile(pszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); hr = (hf != INVALID_HANDLE_VALUE) ? S_OK : HRESULT_FROM_WIN32(CommDlgExtendedError());
} if (SUCCEEDED(hr))
{
cBytes = GetFileSize(hf, NULL); // 64K limit hr = (cBytes != -1) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
} if (SUCCEEDED(hr))
{
hr = ReadFile(hf, &uTemp, 2, &dwRead, NULL) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
} if (SUCCEEDED(hr))
{
fUnicodeFile = uTemp == 0xfeff; if (fUnicodeFile)
{
cBytes -= 2; pwszCoMem = (WCHAR *)CoTaskMemAlloc(cBytes); if (pwszCoMem)
{
hr = ReadFile(hf, pwszCoMem, cBytes, &dwRead, NULL) ? S_OK : HRESULT_FROM_WIN32(GetLastError()); cch = cBytes / sizeof(WCHAR);
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
UINT uiCodePage = SpCodePageFromLcid(MAKELCID(m_langid, SORT_DEFAULT)); char * pszBuffer = (char *)malloc(cBytes); hr = pszBuffer ? S_OK : E_OUTOFMEMORY; if (SUCCEEDED(hr))
{
SetFilePointer(hf, 0, NULL, FILE_BEGIN); // rewind
hr = ReadFile(hf, pszBuffer, cBytes, &dwRead, NULL) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
} if (SUCCEEDED(hr))
{
cch = MultiByteToWideChar(uiCodePage, 0, pszBuffer, cBytes, NULL, NULL); if (cch)
{
pwszCoMem = (WCHAR *)CoTaskMemAlloc(sizeof(WCHAR) * cch);
}
else
{
hr = E_FAIL;
}
} if (SUCCEEDED(hr))
{
MultiByteToWideChar(uiCodePage, 0, pszBuffer, cBytes, pwszCoMem, cch);
} if (pszBuffer)
{
free(pszBuffer);
}
}
} if (INVALID_HANDLE_VALUE != hf)
{
CloseHandle(hf);
} *ppwszCoMem = pwszCoMem;
*pcch = cch;
return hr;
}
在我自己的程序中载入文件后返回的ppwszCoMem中是乱码,而在SAPI的自带例子中返回的是正确的值,不知是怎么回事?真是有点疑惑!感谢大家给点意见,谢谢!
以下是一个SAPI(微软的语音识别工具)中的例子函数,其实现提取一个filename.txt文件中的内容(有点长,麻烦大家看看):
HRESULT speechconf::GetTextFile(
WCHAR ** ppwszCoMem,//其中*ppwszCoMem 返回文件中的内容,
ULONG * pcch) //为缓存的大小
{
TCHAR pszFileName[_MAX_PATH];//
OPENFILENAME ofn;
HRESULT hr = S_OK;
HANDLE hf = INVALID_HANDLE_VALUE;
DWORD cBytes;
BOOL fUnicodeFile = FALSE;
USHORT uTemp;
WCHAR * pwszCoMem = 0;
ULONG cch = 0;
DWORD dwRead;
size_t ofnsize = (BYTE*)&ofn.lpTemplateName + sizeof(ofn.lpTemplateName) - (BYTE*)&ofn; if (SUCCEEDED(hr))
{
pszFileName[0] = 0; ofn.lStructSize = ofnsize;
ofn.hwndOwner = m_speechconfDlg;
ofn.hInstance = m_hInstance;
ofn.lpstrFilter = _T("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0");
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = pszFileName;
ofn.nMaxFile = _MAX_PATH;
ofn.nMaxFileTitle = _MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
ofn.lpstrDefExt = _T("txt"); hr = GetOpenFileName(&ofn) ? S_OK : E_FAIL;
} if (SUCCEEDED(hr))
{
hf = CreateFile(pszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); hr = (hf != INVALID_HANDLE_VALUE) ? S_OK : HRESULT_FROM_WIN32(CommDlgExtendedError());
} if (SUCCEEDED(hr))
{
cBytes = GetFileSize(hf, NULL); // 64K limit hr = (cBytes != -1) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
} if (SUCCEEDED(hr))
{
hr = ReadFile(hf, &uTemp, 2, &dwRead, NULL) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
} if (SUCCEEDED(hr))
{
fUnicodeFile = uTemp == 0xfeff; if (fUnicodeFile)
{
cBytes -= 2; pwszCoMem = (WCHAR *)CoTaskMemAlloc(cBytes); if (pwszCoMem)
{
hr = ReadFile(hf, pwszCoMem, cBytes, &dwRead, NULL) ? S_OK : HRESULT_FROM_WIN32(GetLastError()); cch = cBytes / sizeof(WCHAR);
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
UINT uiCodePage = SpCodePageFromLcid(MAKELCID(m_langid, SORT_DEFAULT)); char * pszBuffer = (char *)malloc(cBytes); hr = pszBuffer ? S_OK : E_OUTOFMEMORY; if (SUCCEEDED(hr))
{
SetFilePointer(hf, 0, NULL, FILE_BEGIN); // rewind
hr = ReadFile(hf, pszBuffer, cBytes, &dwRead, NULL) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
} if (SUCCEEDED(hr))
{
cch = MultiByteToWideChar(uiCodePage, 0, pszBuffer, cBytes, NULL, NULL); if (cch)
{
pwszCoMem = (WCHAR *)CoTaskMemAlloc(sizeof(WCHAR) * cch);
}
else
{
hr = E_FAIL;
}
} if (SUCCEEDED(hr))
{
MultiByteToWideChar(uiCodePage, 0, pszBuffer, cBytes, pwszCoMem, cch);
} if (pszBuffer)
{
free(pszBuffer);
}
}
} if (INVALID_HANDLE_VALUE != hf)
{
CloseHandle(hf);
} *ppwszCoMem = pwszCoMem;
*pcch = cch;
return hr;
}
在我自己的程序中载入文件后返回的ppwszCoMem中是乱码,而在SAPI的自带例子中返回的是正确的值,不知是怎么回事?真是有点疑惑!感谢大家给点意见,谢谢!
解决方案 »
- MFC不出现图片,代码怎么改正?
- 删除txt 指定的文本
- windows剪贴板 & 内存泄露
- 只关闭记录集,不关闭数据连接会有什么问题发生呢??会不会造成资源泄露?
- 请问那里有多播(组播)文件传输和视频传输的源代码下载?谢谢!!
- 既然sohu.com的IP为218.5.79.15,那为何我把这IP地址输入IE里面,而不能打开sohu网页那?
- 16位色位图中每个象素点的RGB颜色格式如何?
- 手把手教你做背单词软件
- GDI+建立字体的时候,一定要用Unicode字符吗?
- GetNextSelectedItem(pos)这个函数看不懂。。求大神指点
- 如何判断不同网段的两个IP地址是否在同一个局域网内?
- 请问谁能用通俗的文字语言说明一下Gabor小波变换的原理啊,谢谢!
问题貌似在这里 这个m_langid值好像不对吧
UINT uiCodePage = SpCodePageFromLcid(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC));
比较好。