'CreateDirectoryW':无法在 OpenCV 2.4.5 和 VS 2010 中将参数 1 从 'const char *' 转换为'LPCWSTR'



我正在尝试从openCV 2.4.5到Visual Studio 2010(基于vc++)的样本代码bagofwords_classification.cpp。但是我发现了错误代码:

error C2664: 'CreateDirectoryW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'   
你能帮我给我解决那个问题的方法吗?谢谢。:)

更新v1:

static void makeDir( const string& dir )
{
#if defined WIN32 || defined _WIN32
    CreateDirectory( dir.c_str(), 0 );
#else
    mkdir( dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH );
#endif
}
static void makeUsedDirs( const string& rootPath )
{
    makeDir(rootPath + bowImageDescriptorsDir);
    makeDir(rootPath + svmsDir);
    makeDir(rootPath + plotsDir);
}

您有调用CreateDirectory的代码。当定义UNICODE时,该符号实际上是CreateDirectoryW的宏;当你也使用TCHAR而不是charwchar_t时,目的是让你使用"模棱两可"的函数名,所以你可以在编译Unicode或Ansi程序之间切换。

std::string不随UNICODE变化;它总是 Ansi,所以它的c_str方法总是返回char*,而不是wchar_t*。当你有一个总是Ansi的参数时,你也应该显式地调用总是Ansi的函数。在本例中,调用CreateDirectoryA

你也可以考虑使用std::basic_string<TCHAR>,但这可能是一个你不希望去的方向。

快速修复将调整您的项目设置,使UNICODE不再被定义。参考工具集的文档,了解如何做到这一点,或者探索IDE的项目选项。

CreateDirectory将被定义为CreateDirectoryW,它期望它的参数是"宽"字符串(UTF-16编码的WCHAR*)。

要创建一个宽字符串,可以将L前缀到常规字符串。

CreateDirectory(L"mydir", NULL);

或者,您可以在属性中将项目切换为多字节编码。这意味着调用CreateDirectory将自动使用CreateDirectoryA版本的函数,该函数接受char*字符串。

CreateDirectoryW接受宽字符,如果您使用Unicode模式则可以。您可能应该使用CreateDirectory或CreateDirectoryA。

最新更新