请考虑以下情形:应用程序链接到第三方库A.
A使用MSVC 2008构建,并且静态链接(即使用/ MT构建)到C运行时库v9.0.
该应用程序使用MSVC 2005构建,并静态链接到A和(使用/ MT)到C运行时库v8.0.
我可以看到这个问题 - 例如,如果在运行时库版本之间的标题中更改了类型.
是否注意使运行时库头在版本之间保持兼容,或者是否应始终确保所有静态链接库都链接到运行时库的相同版本?
我正在阅读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上做了一些谷歌,但没有找到运气.有些专家可以向我解释上面的代码段,尤其是以下内容:
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
是什么意思?变量pinit有什么意义?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) 我和其他几千人正在收到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中的额外缓冲区检查可能是一件好事.
另一方面,我不在乎.这不是程序无法继续,而是程序无法安全继续.好吧,我宁愿不安全,因为它总比没有好.我喜欢危险地生活.
所以有人可以建议吗?我在想这样的事情:
我尝试搜索编写Microsoft Visual C++运行时库的公司的支持站点,但他们没有提到哪些函数可能溢出,或者如何禁用溢出检查.
我正在使用多个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中删除,一切正常.
我的问题:
在问题的情况下,Windows似乎不遵循程序集搜索序列或动态链接库搜索顺序.具体来说,它是在加载DLL的路径中查找私有程序集,而不是从中加载应用程序(EXE).
我试图通过将程序集放在DLL附近,并更改当前目录(以排除与工作目录案例相关)来验证这一点,并获得预期的行为.任何人都可以确认这是LoadLibrary
与SxS一起使用时的正常行为吗?
我是否正确地假设没有清单,DLL会回退到非SxS加载顺序,它在EXE的文件夹中找到msvcr80.dll
(而不是程序集清单Microsoft.VC80.CRT.manifest
)?
如果我对(1)和(2)是正确的,那么只要从DLL中排除清单我会失去什么?改写,为什么我不应该通过排除清单来解决我的问题?
我试图弄清楚如何提示输入密码,并将用户输入回显为星号(********
)
最近,我开始创建一个可以连接到使用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 制作一个简单的 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) 这个问题与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程序员的生活更加艰难?
该符号myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345
出现在崩溃的应用程序的堆栈跟踪中。它是使用MSVC2015编译的C ++,并且大量使用Qt。
myLibrary
没有显式实现该名称的任何内容。
Google对该名称显示了一些点击率,因此显然它并不特定于该应用程序。但我找不到对此的解释。
我正在运行我在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++
我已经读过很久以前但是无法在msdn或网络上的任何其他地方找到对crt的更改.
我认为msvcrt已经在VS2012的VC++版本中进行了更改,它不再使用private heap
for分配和使用process heap
.
Afaik它针对多个库中分配的内存问题,这些库静态地链接到crt,然后在另一个分配了lib的内存中释放内存.
这是我观点的一个重大变化,我想知道为什么我找不到任何提及它的文件.无论是我还是我做了(我怀疑,因为我前段时间与同事讨论过这个话题)
msvcrt ×10
c++ ×3
c ×2
crt ×2
getch ×2
python ×2
visual-c++ ×2
windows ×2
curses ×1
debugging ×1
dependencies ×1
deprecated ×1
dll ×1
echo ×1
loadlibrary ×1
manifest ×1
passwords ×1
posix ×1
side-by-side ×1
stack-trace ×1