-1

对于这个问题中缺少代码片段及其模糊性,我请求您耐心等待,但我完全一无所知,我对错误的位置没有任何线索,我无法粘贴整个应用程序。

C我有一个跨平台应用程序,它通过普通API(等)打开文件fopen,写入一些数据(首先将缓冲区传递给 zlib 以使其放气,但我认为这不相关)持续时间,最后冲洗并关闭它。

这在所有平台上都可以正常工作,除了打开 UAC 的 Windows OS x64 上的 64 位构建。基本上,在那个精确的设置中,文件缓冲区似乎与我在stdout打开文件和刷新文件之间发送的内容交错,就好像任何写入stdout使用另一个文件的相同缓冲区一样。

重要的是要注意,这不应该与任何文件系统虚拟化(VirtualStore机制)相关,正如我在%USERPROFILE%\Saved Games\. 这个问题肯定与 UAC 有关,因为如果我关闭它,问题就不会发生。中也没有问题wine64

任何指针都是有价值的。编译器是 g++ 4.7.0(从 linux 交叉编译)。

4

1 回答 1

0

我找到了解决此问题的方法。

第一个障碍是我用 编译了我的应用程序-mwindows,这阻止了我的应用程序附加到父进程控制台。但是切换到-mconsole不仅可以解决问题。即使进行了这种更改,我发送的所有内容都stdout没有发送到控制台。我没有在问题中说明这个问题,因为这没什么大不了的,应用程序中有另一种控制台。

我确信整个问题是由于msvcrt. 基本上,当我的应用程序启动时,stdout它是一个有效的指针,但它并没有真正附加到父控制台。我必须做一个freopen( "CON", "wt", stdout );才能看到输出。此外,fileno(stdout) 没有 UAC正确返回1,但打开 UAC,stdout仍然是一个有效的指针,但调用fileno(stdout)return -1!我想知道stdout在第二种情况下真正指向哪里。

有趣的是,使用 编译时-mwindowsfileno(stdout)返回 3!我不知道 POSIX 标准是否要求stdout文件描述符编号为 1,但至少选择 3 是不寻常的。

于 2012-10-01T01:52:20.617 回答