大家好:
  以下是一个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的自带例子中返回的是正确的值,不知是怎么回事?真是有点疑惑!感谢大家给点意见,谢谢!