标签: msvcrt

静态链接使用不同版本的C运行时库构建的库,好还是坏?

请考虑以下情形:应用程序链接到第三方库A.

A使用MSVC 2008构建,并且静态链接(即使用/ MT构建)到C运行时库v9.0.

该应用程序使用MSVC 2005构建,并静态链接到A和(使用/ MT)到C运行时库v8.0.

我可以看到这个问题 - 例如,如果在运行时库版本之间的标题中更改了类型.

是否注意使运行时库头在版本之间保持兼容,或者是否应始终确保所有静态链接库都链接到运行时库的相同版本?

c++ crt msvcrt static-linking visual-c++

9
推荐指数
1
解决办法
2709
查看次数

如何在VC中输入main()例程之前执行一些代码?

我正在阅读Microsoft的CRT源代码,我可以提出以下代码,其中函数__initstdio1将在main()例程之前执行.

问题是,如何在VC(不是VC++代码)中输入main()例程之前执行一些代码?

#include <stdio.h>

#pragma section(".CRT$XIC",long,read)

int __cdecl __initstdio1(void);

#define _CRTALLOC(x) __declspec(allocate(x))

_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;

int z = 1;

int __cdecl __initstdio1(void) {
    z = 10;
    return 0;
}

int main(void) {
    printf("Some code before main!\n");
    printf("z = %d\n", z);
    printf("End!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

Some code before main!
z = 10
End!
Run Code Online (Sandbox Code Playgroud)

但是,我无法理解代码.

我在.CRT $ XIC上做了一些谷歌,但没有找到运气.有些专家可以向我解释上面的代码段,尤其是以下内容:

  1. 这条线_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;是什么意思?变量pinit有什么意义?
  2. 在编译期间,编译器(cl.exe)会发出如下警告:

Microsoft(R)32位C/C++优化编译器版本15.00.30729.01 for 80x86版权所有(C)Microsoft Corporation.版权所有.

stdmacro.c
stdmacro.c(9) : warning C4047: 'initializing' : 'int' differs …
Run Code Online (Sandbox Code Playgroud)

c crt msvcrt

8
推荐指数
2
解决办法
5601
查看次数

如何在Visual C++运行时中禁用缓冲区溢出检查?

我和其他几千人正在收到Microsoft Visual C++运行时抛出的错误:

替代文字http://i46.tinypic.com/2enceus.png

为了搜索引擎的利益,它说:

Microsoft Visual C++ Runtime Library

Buffer overrun detected!

Program: %s

A buffer overrun has been detected which has corrupted the program's
internal state. The program cannot safely continue execution and must
now be terminated.
Run Code Online (Sandbox Code Playgroud)

现在我明白缓冲区溢出是什么,以及为什么它是一件坏事.鉴于微软新近强调" 它刚刚破解 ",MSVCRT中的额外缓冲区检查可能是一件好事.

另一方面,我不在乎.这不是程序无法继续,而是程序无法安全继续.好吧,我宁愿不安全,因为它总比没有好.我喜欢危险地生活.

所以有人可以建议吗?我在想这样的事情:

  • 一个注册表项,以防止MSVCRT停止执行
  • 使用以前的操作系统运行应用程序(Windows 7之前)
  • 将程序集清单添加到可执行文件夹,以便它使用旧版本的MSVCRT,不执行此溢出检查
  • 没有溢出检查的MSVCRT副本的版本号或下载位置

我尝试搜索编写Microsoft Visual C++运行时库的公司的支持站点,但他们没有提到哪些函数可能溢出,或者如何禁用溢出检查.

windows compatibility msvcrt buffer-overflow

8
推荐指数
1
解决办法
1万
查看次数

LoadLibrary()无法加载带有清单和私有程序集的DLL

我正在使用多个DLL的Windows应用程序(EXE).开发在VCExpress 2005(VC 8.0)中,仅使用C语言.

其中一些DLL是插件/加载项/扩展,它们LoadLibrary根据EXE读取的配置文件动态加载.

重要的是:应用程序必须是可移植的(能够在没有安装的情况下从USB闪存驱动器或类似驱动器运行),并且插件DLL可能与应用程序EXE不在同一文件夹中(遗留原因).

使用MSVC6,这很简单:编译,链接,分发EXE和DLL.

使用MSVC8,C运行时库(MSVCRT)不再随操作系统一起分发,因此无法依赖它安装.为了满足可移植性要求,我需要使用私有程序集.所有EXE和DLL都已嵌入其清单.

我的问题:通过加载的插件DLL LoadLibrary()找不到EXE文件夹中的私有程序集,因此尝试加载它们会失败,除非Microsoft.VC80.CRT程序集安装在winSxS中.

问题:如果清单从插件DLL中删除,一切正常.

我的问题:

  1. 在问题的情况下,Windows似乎不遵循程序集搜索序列动态链接库搜索顺序.具体来说,它是在加载DLL的路径中查找私有程序集,而不是从中加载应用程序(EXE).
    我试图通过将程序集放在DLL附近,并更改当前目录(以排除与工作目录案例相关)来验证这一点,并获得预期的行为.任何人都可以确认这是LoadLibrary与SxS一起使用时的正常行为吗?

  2. 我是否正确地假设没有清单,DLL会回退到非SxS加载顺序,它在EXE的文件夹中找到msvcr80.dll(而不是程序集清单Microsoft.VC80.CRT.manifest)?

  3. 如果我对(1)和(2)是正确的,那么只要从DLL中排除清单我会失去什么?改写,为什么我不应该通过排除清单来解决我的问题?

dll manifest msvcrt loadlibrary

8
推荐指数
2
解决办法
5753
查看次数

如何将密码回显为星号

我试图弄清楚如何提示输入密码,并将用户输入回显为星号(********)

最近,我开始创建一个可以连接到使用Python中的套接字模块的远程服务器的项目.它还没有完成,因为我正在使控制台用于连接服务器.

我正在尝试创建一个登录窗口,提示用户输入用户名和密码,但输入密码时我正在寻找要打印的星号,就像常见的密码输入一样(即 - Sekr3t被回复为:******).

经过几天的研究,我差不多完成了仍然有一个最后的错误,让我疯了(我完全无法解决它).注意 - 我知道有一个getpass模块可以用来替换它,更容易,但没有回声不是我正在寻找的.

这是我到目前为止的密码登录代码,我无法弄清楚为什么它不会回响星号:

import msvcrt
import sys

def login(prompt = '> '):
   write = sys.stdout.write

   for x in prompt:
       msvcrt.putch(x)
   passw = ""

   while 1:
       x = msvcrt.getch()
       if x == '\r' or x == '\n':
           break
       if x == '\b':
           # position of my error
           passw = passw[:-1]
       else:
           write('*')
           passw = passw + x
   msvcrt.putch('\r')
   msvcrt.putch('\n')
   return passw
Run Code Online (Sandbox Code Playgroud)

>

如果您通过代码阅读和/或通过IDLE之类的内容运行它,您可能会注意到当用户后退空间时,存储的数据被一个字符擦除,但打印的星号不是.ie - Sekr3t + backspace = Sekr3,但是******留下了回音.任何关于如何在输入退格时擦除最后一个星号的帮助将不胜感激.另请注意,很多此代码来自getpass模块.我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待.

python passwords msvcrt getch echo

8
推荐指数
1
解决办法
9371
查看次数

Python输入单字符不回车

我想要做的是用 Python 制作一个简单的 pi 记忆游戏。我需要的是一种无需在每个字符后按“输入”即可从用户那里获取输入的方法。听起来我需要像 getch 这样的东西,但我无法让它工作。我从这里得到了一个类似 getch 的函数:https : //gist.github.com/chao787/2652257#file-getch-py。我真的不明白里面的任何东西。当我做' x = getch.getch()'它说“ AttributeError: '_Getch' object has no attribute 'getch'”。看起来 msvcrt 可以在 Windows 上做到这一点,但我有一台 Mac。看起来curses 也是一个有getch 的东西,但它说我需要先做initscr,然后我得到错误“ File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/curses/__init__.py", line 30, in initscr fd=_sys.__stdout__.fileno()) _curses.error: setupterm: could not find terminal”。

这是我只使用输入的文件,您每次都必须按 Enter 键(我实际上输入了 1000 位数字,而不是省略号)。

pi = '3.1415926535...'


def main():
    print('Welcome to PiGame!')
    pigame()
    while True:
        yn = input('Play again? y/n ')
        if yn == 'y':
            pigame()
        else: return


def pigame():

    n=0

    print('Go!')


    while …
Run Code Online (Sandbox Code Playgroud)

python curses msvcrt getch

8
推荐指数
1
解决办法
1万
查看次数

微软强调C函数的目的是什么?

这个问题与strdup或_strdup有关?但它不一样.那个问题询问如何解决 MS的重命名问题,这个问题问他们为什么要这样做.

出于某种原因,Microsoft已经采用了大量POSIX C函数,并且已经弃用并用_-prefixed变体替换它们.许多人的一个例子是isatty:

https://msdn.microsoft.com/en-us/library/ms235388.aspx

This POSIX function is deprecated. Use the ISO C++ conformant _isatty instead.
Run Code Online (Sandbox Code Playgroud)

ISO C++到底符合什么_isatty?在我看来,MSDN的帮助是完全错误的.

其他问题的答案解释了如何处理这个问题.你添加了_CRT_NONSTDC_NO_DEPRECATE定义.精细.但我想知道微软的想法是什么.他们在重命名和弃用函数方面有什么意义?是不是让C程序员的生活更加艰难?

c posix msvcrt deprecated visual-studio

8
推荐指数
1
解决办法
899
查看次数

什么是`myLibrary!__ scrt_stub_for_is_c_termination_complete + 0x12345`

该符号myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345出现在崩溃的应用程序的堆栈跟踪中。它是使用MSVC2015编译的C ++,并且大量使用Qt。

myLibrary 没有显式实现该名称的任何内容。

Google对该名称显示了一些点击率,因此显然它并不特定于该应用程序。但我找不到对此的解释。

c++ windows debugging msvcrt stack-trace

8
推荐指数
1
解决办法
227
查看次数

Dependency Walker错误:"ABC.DLL"的并排配置信息包含错误

我正在运行我在Visual Studio 2010中构建的程序,该程序使用第三方DLL"ABC.DLL".我在Windows 7 64位上.

但是,由于一个DLL,它无法运行.在此DLL上运行Dependency walker时,我收到以下错误:

错误:"...\ABC.DLL"的Side-by-Side配置信息包含错误.应用程序无法启动,因为它的并排配置不正确.请参阅应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息(14001).

缺少依赖关系MSCVR80.DLL和MSVCP80.DLL.

我已经尝试了以下主题中的所有解决方案,但我仍然遇到同样的错误.

ABC.DLL是在Visual Studio 2005中构建的第三方库,我无法重建它.

我已经安装了Visual Studio C++ 2005 Redistributable,并尝试复制从另一台计算机上获取的DLL(因为我的计算机中没有它)并且没有任何作用.

dependencies msvcrt side-by-side visual-studio-2010 visual-c++

7
推荐指数
1
解决办法
9023
查看次数

msvcrt是否使用不同的堆进行分配(vs2012/2010/2013)

我已经读过很久以前但是无法在msdn或网络上的任何其他地方找到对crt的更改.

我认为msvcrt已经在VS2012的VC++版本中进行了更改,它不再使用private heapfor分配和使用process heap.

Afaik它针对多个库中分配的内存问题,这些库静态地链接到crt,然后在另一个分配了lib的内存中释放内存.

这是我观点的一个重大变化,我想知道为什么我找不到任何提及它的文件.无论是我还是我做了(我怀疑,因为我前段时间与同事讨论过这个话题)

c++ msvcrt

7
推荐指数
1
解决办法
1181
查看次数