更新:这个问题更像是"用C++编写的部署基于Internet的应用程序的最佳方式.这需要Microsoft Visual C++运行时."
MS Visual C++运行时库中有什么?我的意思是,我google了它,我总是发现像帮助,app xxxx给我MS Visual C++运行时库错误,没有解释.
我认为Windows C运行时库附带Windows?不是用VC++?谢谢.
编辑:首先,谢谢你的答案.我现在对Windows中的运行时库不太了解.我的意思是,第一部分,Windows内部有它的win32 API,所以,没关系,我知道.此外,Win32API来自内核和用户部分.
但我一直认为像GDI这样的函数是作为DLL访问的(我仍然认为它们是).但我认为即使是像printf
某些Windows文件中的函数也是如此.
所以,我是对的,当我知道"简单"函数printf
需要直接链接而不是直接使用OS的内核部分时,更复杂的Windows API函数作为dll链接,因此不与编译器一起分发但是用OS?他们随后访问内核?
我的意思是,让我们说GDI,我告诉它画画,它在用户模式下做了所有的努力,而不是调用内核函数把它全部放在帧缓冲中?
最后想到,为什么这样解决了呢?我的意思是,如果VC++运行时只是C和WinAPI之间的层,为什么VC++不能直接调用WinAPI?
我正在尝试对名为的Visual C++ 2008 SEH处理程序进行逆向工程,__CxxFrameHandler3
以提供可以将结果委托给(旧版本)__CxxFrameHandler
的实现msvcrt.dll
.
(此页面和此页面包含有关msvcrt.dll
SEH的详细信息.)
注意: msvcrt_winxp.obj
(32位)和msvcrt_win2003.obj
(64位)已经做同样的事情 - 它们是Windows Driver Kit 7.1的一部分.但是,它们还捆绑了许多其他代码,这会混淆我的链接器.
我成功地拆解了32位版本(msvcrt_winxp.obj
),提取__CxxFrameHandler3
并创建了一个提供适当实现的替代方案.
但是,我遇到了64位版本(msvcrt_win2003.obj
)的问题:
即使我的64位实现看起来完全相同,但它不起作用 - 但微软提供的实际工作确实有效.
这是32位版本(可正常工作):
.386
.model flat, c
option dotname
extern __CxxFrameHandler: PROC
.code
includelib msvcrt.lib
public __CxxFrameHandler3
__CxxFrameHandler3:
push ebp
mov ebp,esp
sub esp,28h
push ebx
push esi
push edi
cld
mov dword ptr [ebp-4],eax
mov esi,dword …
Run Code Online (Sandbox Code Playgroud) 在Windows 8上,我们遇到了FreeConsole的问题.它似乎关闭了stdio句柄,而没有关闭文件流.
这可能是Windows 8的问题,或者可能是我根本不理解Windows控制台/ GUI应用程序子系统执行操作的方式(完全荒谬).
这是怎么回事?
下面的最小例子.使用静态链接的CRT对编译器进行测试:VS2005,VS2013,VS2017.
#include <windows.h>
#include <io.h>
#include <stdio.h>
static void testHandle(FILE* file) {
HANDLE h = (HANDLE)_get_osfhandle(fileno(file));
DWORD flags;
if (!GetHandleInformation(h, &flags)) {
MessageBoxA(0, "Bogus handle!!", "TITLE", MB_OK);
}
}
int main(int argc, char** argv)
{
freopen("NUL", "wb", stdout); // Demonstrate the issue with NUL
// Leave stderr as it is, to demonstrate the issue with handles
// to the console device.
FreeConsole();
testHandle(stdout);
testHandle(stderr);
}
Run Code Online (Sandbox Code Playgroud) 是否有任何方法可以列出VS2012中可用的平台工具集?我的意思是列表可能包含v90,v100,v110,v110_xp和任何外部提供的平台工具集.或者(应该更容易):有没有办法检查是否安装了给定的平台工具集?
作为练习,我正在编写一个内存管理器 - 即实现malloc,realloc和free(或new和delete)的代码.我的语言Delphi 的RTL允许轻松替换RTL的内存管理器.对于那些使用C++的人来说,这类似于,但是低于覆盖新的和删除(它挂钩到RTL本身而不是语言特征.)我正在寻找有关其他人拥有的高质量方法的资源.采取了同样的问题.
我知道一些内存管理算法和实现,包括FastMM4(非常复杂),Doug Lea的分配器,Buddy,JeMalloc,TcMalloc和Hoard.我正在搜索有关以下内容的信息:
已知的推荐算法:除上述之外还有哪些其他高质量算法?
是否有针对高线程应用程序定制的特定算法?也就是说,在任何锁定点处可能存在高线程争用以进行分配或释放,并且可能在一个线程中分配内存但在另一个线程中解除分配?大多数算法 - 除了Hoard,JeMalloc和TcMalloc之外 - 似乎都是针对单线程工作而设计的,线程感知只是线程安全,因为在适当的点有锁或其他同步 - 没有特殊的设计.
主要供应商使用什么? 虽然Delphi和C++ Builder的是记录,我无法找到关于由MS VC++,.net或目的C.使用的实现方式中的任何信息(所有文件似乎是级别更高,如NSAutoReleasePool
例如,Linux的似乎使用好友).这些供应商似乎不允许他们的RTL像Delphi那样被吸引.我会非常有兴趣阅读他们的实现.
我正在使用 Visual Studio 2017 编译一个程序,该程序与 libusb 的预编译静态版本链接,可在此处获得。
当我尝试链接它时,我得到了一些像这些未解析的符号,答案指向我legacy_stdio_definitions.lib
解决了所有链接器错误,除了:
unresolved external symbol __imp__iob
Run Code Online (Sandbox Code Playgroud)
微软的这个页面谈论legacy_stdio_definitions.lib
并说它提供__imp___iob
但没有提到__imp__iob
(注意不同数量的下划线)。
这里发生了什么?
(另外,是的,混合 CRT 版本是一个坏主意,我真的应该从源代码编译 libusb。我知道。)
我被困在这里(下图),需要通过它才能读取我的文本。我还有 text.txt 文件。该程序本身无法使用 python 2 运行。使用 python 2 它在这里给了我一个错误:print(last_suggestion, end=' ', flush=True)
。
train_data = 'text.txt'
first_possible_words = {}
second_possible_words = {}
transitions = {}
def expandDict(dictionary, key, value):
if key not in dictionary:
dictionary[key] = []
dictionary[key].append(value)
def get_next_probability(given_list): #returns dictionary
probability_dict = {}
given_list_length = len(given_list)
for item in given_list:
probability_dict[item] = probability_dict.get(item, 0) + 1
for key, value in probability_dict.items():
probability_dict[key] = value / given_list_length
return probability_dict
def trainMarkovModel():
for line in open(train_data):
tokens = line.rstrip().lower().split() …
Run Code Online (Sandbox Code Playgroud) 我有一个嵌入了以下清单的程序集:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)
在我的一台机器上,这个组件不起作用(组件无法加载).在依赖walker中打开它给我以下错误消息:
Error: The Side-by-Side configuration information for "SomeAssembly.dll" contains errors. This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem (14001).
Run Code Online (Sandbox Code Playgroud)
相同的程序集在另一台机器上工作正常,并且我没有得到依赖walker的错误.
至于我可以工作出了问题是由于第一台机器缺少某种(例如MSVCR可再发行)的依赖,但是我已经检查和微软的Visual C++ 2005可再发行组件安装罚款在两台机器上.
我该如何找出遗漏的依赖是什么?
我注意到的唯一事情是工作机器上的WinSxS目录有一个额外的条目:
x86_Microsoft.VC80.ATL_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_473666fd
Run Code Online (Sandbox Code Playgroud) msvcrt ×10
visual-c++ ×5
c++ ×2
algorithm ×1
assembly ×1
macos ×1
python ×1
python-3.x ×1
runtime ×1
seh ×1
side-by-side ×1
winapi ×1
windows ×1
windows-8 ×1