const WCHAR * myVar vs const char * myVar

时间:2013-02-20 18:42:35

标签: c++ c winapi

我开发了一个小型的bmp到jpg转换器。 以下代码正在运行并提供我需要的精确结果

BOOLEAN convertBMPtoJPG(const WCHAR *src_bmp_path,const WCHAR *dest_jpeg_path);

然后将函数调用为,

const WCHAR *src_bmp_path = L"test.bmp";
const WCHAR *dest_jpeg_path= L"test.jpg";
convertBMPtoJPG(src_bmp_path,dest_jpeg_path);

但是我需要按照以下方式更改函数(根据我已经给出的要求),但这样做会导致编译错误。

BOOLEAN convertBMPtoJPG(char *src_bmp_path,char *dest_jpeg_path);

那么函数将被称为,(虽然我只需要按照上面的原型),

char *src_bmp_path = "test.bmp";
char *dest_jpeg_path= "test.jpg";
convertBMPtoJPG(src_bmp_path,dest_jpeg_path);

关于stackover的另一个问题提供了关于Win32类型的太多信息,但是我还是无法解决这个问题。 我在Win32 API中不是很好,请指导我以后的方法出了什么问题。

修改

错误讯息: 错误C2664:'Gdiplus :: Status Gdiplus :: Image :: Save(const WCHAR *,const CLSID *,const Gdiplus :: EncoderParameters *)':无法将参数1从'char *'转换为'const WCHAR * “ 1 GT;指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换

2 个答案:

答案 0 :(得分:2)

Image::Save()仅接受WCHAR*个值,因此您的char*包装器必须转换为WCHAR*,例如MultiByteToWideChar()(就像Win32 API Ansi一样)函数在内部调用Win32 API Unicode函数时执行,例如:

std::wstring towstring(const char *src)
{
    std::wstring output;
    int src_len = strlen(src);
    if (src_len > 0)
    {
        int out_len = MultiByteToWideChar(CP_ACP, 0, src, src_len, NULL, 0);
        if (out_len > 0)
        {
            output.resize(out_len);
            MultiByteToWideChar(CP_ACP, 0, src, src_len, &output[0], out_len);
        }
    }
    return output;
}

BOOLEAN convertBMPtoJPG(char *src_bmp_path,char *dest_jpeg_path)
{
    return convertBMPtoJPG(towstring(src_bmp_path).c_str(), towstring(dest_jpeg_path).c_str());
}

BOOLEAN convertBMPtoJPG(const WCHAR *src_bmp_path, const WCHAR *dest_jpeg_path)
{
   // your existing conversion logic here...
}

答案 1 :(得分:0)

好吧,看起来你正在编译Unicode支持。可以找到Win32数据类型列表here

WCHAR定义为 -

 A 16-bit Unicode character. For more information, see Character Sets Used By Fonts.
 This type is declared in WinNT.h as follows:
 typedef wchar_t WCHAR;

以下链接显示了如何在各种字符串类型String Conversion Samples.

之间进行转换