Articles of msvcrt

我应该与我的应用程序重新分配msvcrt.dll?

我应该重新分配msvcrt.dll与我的应用程序,并使用私人DLL如果一些应用程序的库dynamic依赖msvcrt.dll? 即与系统的msvcrt.dll(DLL地狱)可能的任何不兼容问题? 应用程序是针对Windows Server系统的。

Windows的mallocreplace(例如,tcmalloc)和dynamic的crt链接

一个使用多个DLL和QT的C ++程序应该配备一个mallocreplace(如tcmalloc ),用于解决可由Windows malloc导致的性能问题。 有了linux,没有问题,但是使用windows,有几种方法,我觉得它们都没有吸引力: 1.将新的malloc放在lib中,并确保先链接(其他SO-问题) 这有一个缺点,例如, strdup仍然会使用旧的malloc,而且免费的可能会导致程序崩溃 。 2.使用lib.exe(Chrome)从静态libcrt库中删除malloc 这是铬/铬testing/使用(?),但有缺点,它只是与静态链接crt的作品。 静态链接有问题,如果一个系统库与msvcrtdynamic链接可能会在堆分配/取消分配不匹配 。 如果我的理解正确,tcmalloc可以被dynamic地链接起来,以便所有自编译的dll(这是很好的)有一个共同的堆。 3.补丁crt源代码(firefox) Firefox的jemalloc显然修补了Windows CRT源代码,并构build了一个新的crt。 这又是上面的静态/dynamic链接问题。 有人可能会想到使用它来生成一个dynamic的MSVCRT,但我认为这是不可能的,因为许可证禁止提供一个打补丁MSVCRT同名。 4.在运行时dynamic修补加载的CRT 一些商业内存分配器可以做这样的魔术。 tcmalloc也可以,但是这看起来相当难看。 它有一些问题,但他们已经修复。 目前,使用tcmalloc它不能在64位窗口下工作。 有更好的方法吗? 任何意见?

文件句柄上的WaitForSingleObject?

当你用CreateFile()或_get_osfhandle()创build的句柄调用WaitForSingleObject()时会发生什么? 由于不值得解释的原因,我想使用WaitForSingleObject()来等待我用_get_osfhandle(fd)创build的HANDLE,其中fd来自对_open()的常规调用。 这可能吗? 我已经在实践中尝试过了,在一些机器上它按预期工作(HANDLE总是处于信号状态,因为你可以从中读取更多的数据),而在某些机器上, WaitForSingleObject()将会无限期地阻塞。 WaitForSingleObject()的MSDN页面表示它唯一支持的事情是“更改通知,控制台input,事件,内存资源通知,互斥量,进程,信号量,线程和等待定时器”。 另外,如果我在CRT文件描述符上使用CreateFile()而不是_get_osfhandle() ,会不一样?

fopen怎么比fopen更安全?

我正在处理Windows平台的遗留代码。 当我在VS2013编译代码时,会发出以下警告: “错误C4996:' fopen ':这个函数或variables可能是不安全的,请考虑使用fopen_s来取消弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助。 而且它也会给sprintf惊人的警告。 我明白,由于缓冲区溢出, sprintf_s比sprintf更安全。 但是怎样才能比fopen更安全,因为fopen不接受缓冲区,没有缓冲区溢出的机会。 任何人都可以提供一个案件fopen是不安全的, fopen_s是安全的?

为什么msvcrt(非常非常慢)?

我具体询问旧的msvcrt.dll 。 没有Microsoft更新该库在较新版本的Windows中? 或者是在Windows 98发行版中可以find的完全相同的库? 我用一个testing程序对Cygwin进行了msvcrttesting,通过一个带有互斥锁和信号量的单链表阻塞队列,很多次调用了malloc 。 通过ifdef s,程序可以被编译为使用Posix函数或者使用Windows API调用。 当由WinGUI编译MinGW时,调用唯一的依赖项是kernel32.dll , ntdll.dll和msvcrt.dll ,而当由Cygwin用Posix函数编译时,程序将依赖于cygwin1.dll 。 我起初只是假设Cygwin版本将运行较慢,因为Posix函数的额外仿真层; 它必须将它们转换成WinAPI调用。 但是看起来,它比MinGW编译的本机二进制文件在我的机器上运行速度快了四倍。 Cygwin的文档声明它使用了一个名为newlib的不同的libc,当然Cygwin编译的二进制文件似乎不依赖于msvcrt。 那么这是否会造成巨大的速度差异呢? 我也曾经经历过,当一个C程序调用数百万个malloc ,取决于msvcrt.dll运行速度比任何其他运行速度慢许多倍,这取决于新的msvcrXX.dll 。 他们甚至比运行在虚拟机linux下的相同程序跑得慢。 什么是msvcrt.dll错误? 我应该尽可能避免吗?

不同DLL的公共运行时

我需要构build一个能够在运行时加载其他DLL的DLL; 这些其他DLL与主DLL(这是Python和扩展)有一个相当密切的关系,所以它们必须有一个公共的运行时间。 主DLL 必须是可以简单地复制到目标机器上的单个文件。 辅助DLL将被放置在不同的目录中。 所以:“公共运行时”意味着没有静态链接; “单个文件+简单复制”排除了共享的MS可再发行组件,特别是与“不同的目录”结合在一起时。 我只看到以下选项:链接所有DLLs msvcrt.dll ; 将当前msvcrtXXembedded到主DLL中,并重新导出其所有符号; 使用主机应用程序的msvcrtXX 。 对我来说,第一个看起来是最简单的,因为这是一个普遍的需求,有很多网页解释如何去做。 你将如何处理这个?

解决太多静态链接CRT的限制?

当通过LoadLibrary加载外部DLL(不在我们的控制下)时,我们遇到了一个问题,那些DLL中的静态链接CRT无法分配光纤本地存储。 这与mskb 193462类似,只是这是FLS,只有128个。 有没有什么有用的方法来解决这个问题? CRT使用GetProcAddressfindFlsAlloc无论如何(因为这显然从来没有在XP中),所以它甚至真的需要它? (这是在Vista中,其中FlsAlloc实际存在; DLL似乎使用MSVC8)

在Windows上访问python的msvcrt的方式有什么区别?

在Windows上,以下有什么区别? import msvcrt as x VS x = ctypes.cdll.msvcrt VS x = ctypes.CDLL(find_library('c')) VS x = ctypes.CDLL(ctypes.util.find_msvcrt()) 我相信文件说最后两个是相同的。 但前两个从来没有(清楚)logging,似乎更好。 例如,从使用不同msvcr*.dll (例如,matlab)的其他上下文运行python时,用第二个replace第三个解决了这个错误 。