-1

我有一个LPCSTR我想转换为std::stringorchar*的。

LPCSTR strName;
_tprintf(_T("%s\n"), strName);

我想把电脑上所有的音频设备都弄出来并显示出来,但是要LPCSTR直接输出的类型是乱码,用上面的代码输出正确的结果。

有没有办法保存正确的输出?

以下是完整代码:

Add a dependency to the property:
comctl32.lib;winmm.lib;dsound.lib;dxguid.lib;odbc32.lib;odbccp32.lib

ListSoundDev.h

#ifndef _LISTSOUNDDEV_HEAD_
#define _LISTSOUNDDEV_HEAD_
#include<tchar.h>
#include <dshow.h>
#include<iostream>
#include<vector>
#include<mmsystem.h>
#include<mmreg.h>
#include<dsound.h>

#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "Quartz.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "dxguid.lib")

#pragma comment(lib, "strmiids")
using namespace std;

typedef struct _DevItem
{
    LPCSTR strName;
    GUID guid;
} DevItem;
#endif

主文件

#include"ListSoundDev_head.h"
std::vector<DevItem>    m_CapDevices;
BOOL CALLBACK DSEnumCallback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext)
{
    std::vector<DevItem> *pLst = (std::vector<DevItem> *) lpContext;
    if (pLst)
    {
        DevItem item;
        memset(&item, 0, sizeof(item));
        item.strName = lpcstrDescription;
        if (lpGuid)
            item.guid = *lpGuid;
        else
            item.guid = GUID_NULL;
        pLst->push_back(item);
        return TRUE;
    }
    return FALSE;
}
int main()
{
    std::vector<DevItem>::iterator it;
    HRESULT hr = S_OK;
    setlocale(LC_ALL, "chs");
    hr = DirectSoundCaptureEnumerate((LPDSENUMCALLBACKW)DSEnumCallback, (LPVOID)&m_CapDevices);
    for (it = m_CapDevices.begin(); it != m_CapDevices.end(); it++){
        _tprintf(_T("%s\n"), it->strName);//output correct
        printf("%s\n",it->strName);//output error
        std::cout << it->strName << std::endl;//output error
    }
}

预期输出:

麦克风 (Realtek High Definition Au

实际输出:

KQ螛</p>

预期输出:

瑞昱数字输入(瑞昱

实际输出:

R

我怎样才能 printf()或者std::cout可以直接输出正确的结果?

4

1 回答 1

0

非常感谢您的回答,我已经解决了这个问题。

解决方法是使用以下代码进行转换。

字符集是 Unicode。

char newStr[100];
wcstombs(newStr, (wchar_t*)it->strName, 100);
printf("newStr=%s\n", newStr);

字符集是多字节

printf("%s\n", it->strName);

但是,当我在C++控制台中编写这个程序来获取麦克风的音频设备名称(Realtek High Definition Au,但是在MFC中使用这个代码来获取麦克风的设备名称(Realtek High Definition Audio)是什么原因?

于 2016-11-25T03:50:20.417 回答