繁体   English   中英

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

[英]Strange newline issue after DLL call C++ Windows

问题

我正在使用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字符,看起来像字母“ o”,但o的黑色部分是白色,白色部分是黑色(倒置颜色)。 音乐符号是Unicode八音符。

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


到目前为止我尝试过的

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

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

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

最后,我还尝试了以下方法:

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

我看到了由以下对象创建的相同垃圾字符:

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


在此先感谢您的帮助和见解。

查看是否可以解决此问题:

#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. 可以另外配置

您也许可以将另一个流与cout相关联

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

并使用它。 我敢肯定那不是线程安全的。 冲洗可能很“尴尬”-但应该可以

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM