【问题标题】:Expression: string iterators incompatiable, when calling "SetDllDirectory"表达式:字符串迭代器不兼容,调用“SetDllDirectory”时
【发布时间】:2015-07-10 17:05:24
【问题描述】:

我收到以下错误:

调试断言失败!

表达式:字符串迭代器不兼容

当尝试运行这样的代码时:

std::string string_Dir(){return ".\\Dir\\";}
std::wstring wstring_Dir=std::wstring(
    string_Dir().begin()
    ,string_Dir().end()
    );
SetDllDirectory(wstring_Dir.c_str());

有人知道原因吗

顺便说一句:我关注了this

【问题讨论】:

  • 因为string != wstring,因为char != wchar_t

标签: c++ wstring lpcwstr setdlldirectory


【解决方案1】:

您调用string_Dir() 两次,然后使用来自不同 std::string 对象的迭代器来初始化您的std::wstring。这就是您收到不兼容错误的原因。您必须使用来自 same std::string 对象的迭代器,因此调用 string_Dir() 一次并将返回值分配给一个变量:

std::string dir = string_Dir();
std::wstring wstring_Dir(dir.begin(), dir.end());
SetDllDirectory(wstring_Dir.c_str());
// or better: SetDllDirectoryW(wstring_Dir.c_str());

话虽如此,您并未将 ANSI 转换为 UTF-16,因此只有当 string_Dir() 返回包含 7 位 ASCII 字符的 std::string 时,此代码才能正常工作。如果std::string 包含任何非 ASCII 8 位字符,它将失败。

有一个更简单的解决方案 - 您可以致电 SetDllDirectoryA()。您不需要std::wstring,操作系统可以为您进行 ANSI 到 UTF16 的转换:

SetDllDirectoryA(string_Dir().c_str());

【讨论】:

    【解决方案2】:

    根据documentation,函数调用中的值应该是LPCTSTR,而不是LPCTWSTR

    【讨论】:

    • 我正在使用 UNICODE #ifdef UNICODE #define SetDllDirectory SetDllDirectoryW
    • @user4838962 "要编译使用此函数的应用程序,请将 _WIN32_WINNT 定义为 0x0502 或更高版本。"你也这样做了吗?
    • @user4838962 另外,你不会打电话给SetDllDirectoryW而不是SetDllDirectory
    • @JeffS:由于定义了UNICODESetDllDirectory() 映射到SetDllDirectoryW()。但是由于使用的是std::wstring,所以最好直接调用SetDllDirectoryW(),完全不依赖TCHAR映射。
    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2012-07-25
    相关资源
    最近更新 更多