DLL调用C ++ Windows后出现奇怪的换行问题

时间:2011-06-21 07:08:04

标签: c++ windows dll newline corruption

问题

我正在使用Visual Studio 2010在Windows上使用C ++开发一个32位非托管应用程序。原谅我缺乏Windows知识,因为我通常在* nix上开发。

最初,在我的程序中,我对std :: cout的流插入操作符的调用工作正常。例如,以下语句按预期输出:

std::cout << "hello" << std::endl;

但是,以下代码不起作用:

std::cout << "\thello" << std::endl;
...call to DLL from Japanese company who won't respond to support requests...
std::cout << "\thello" << std::endl;

以上代码打印:

hello
     

(倒钻符号)你好(八分音符)(倒o符号)

一旦我第一次调用这个DLL,我对std :: cout的输出就会永远搞砸了。打印的符号在ASCII表中找不到 。倒o符号是单个unicode char,看起来像字母'o'但是o的黑色部分是白色,而白色部分是黑色(倒置的颜色)。音乐符号是unicode第8个音符。

关于为什么会发生这种情况以及如何解决问题的任何想法?似乎这个DLL搞乱了如何输出控制字符(以\开头的字符)。


到目前为止我尝试了什么

我认为这可能是一个区域设置问题,因为DLL来自日本公司。但是,在DLL调用之后,语言环境仍然是“C”,就像在调用之前一样。我使用以下方法查询语言环境:

printf ("Locale is: %s\n", setlocale(LC_ALL,NULL) );

我还认为这可能是某种奇怪的内存损坏,但似乎\ r \ n被(音乐符号)(倒o)取代,而\ t被倒置的菱形符号取代。对于所有控制字符,似乎有一个常规的“替换A by B”模式,这不会表示内存损坏。

最后,我也尝试了这个:

std::cout << "blah" << '\r' << '\n';

我看到创建的垃圾字符相同:

std::cout << "blah" << std::endl;

<小时/> 提前感谢您的任何帮助和见解。

1 个答案:

答案 0 :(得分:1)

看看这是否解决了这个问题:

#include <iostream>
#include <locale>

int main()
{
    std::cout << "\thello" << std::endl;
    // ...call to DLL from Japanese company who won't respond to support requests...
    locale mylocale("");  // or "C"     // Construct locale object with the user's default preferences
    std::cout.imbue( mylocale );   // Imbue that locale
    std::cout << "\thello" << std::endl;  
    return 0;
}

请参阅该库的文档是否

  1. 区域设置的更改是按设计
  2. 可以配置
  3. 可能可能会将另一个流与cout相关联

    std::ostream cout2;
    cout2.rdbuf(std::cout.rdbuf());
    

    并使用它。我确信这不会是线程安全的。法拉盛可能是“尴尬” - 但它应该工作