NtDll是否真的导出了C语言的运行时函数,我能否在我的应用程序中使用这些函数?
我正在查看Windows 10计算机上的NTDLL导出表,我发现它导出了标准C运行时函数,例如memcpy,sprintf,sprintf,strlen,等等. 这是否意味着我可以在运行时通过LoadLibrary和GetProcAddress动态地称呼它们?是否可以保证每个Windows版本是如此? 如果是这样,可以完全放下C运行时库(仅使用NTDLL的CRT函数),因此使我的程序较小? 解决方案 绝对没有理由将这些无证件功能称为NTDLL导出的这些无证功能. Windows导出了所有必需C运行时的功能,作为来自标准系统库的记录包装器,即kernel32.如果您绝对无法链接到C运行时库*,那么您应该调用这些功能.对于内存,您具有基本HeapAlloc和HeapFree(或者也许VirtualAlloc和VirtualFree),ZeroMemory,ZeroMemory,MoveMemory,MoveMemory,CopyMemory等,对于字符串操作, CRT功能
8 2024-04-08
编程技术问答社区
如何避免C语言运行时(crt*.o)的垃圾
我有两个C源文件 foo1.c: #include #include int main(void) { puts("hello world"); return 0; } 和foo2.c: #include #include void _start(void) { puts("hello world"); exit(0); } 我在我的i386 GNU/linux平台上像这样编译了它们: $ #compile foo1 $ cc -o foo1 foo1.c $ #compile foo2 $ cc -S foo2.c $ as -o foo2.o foo2.s $ ld -o foo2 -dynamic-linker /lib/i386-linux-gnu/ld-linux.so.2 -lc foo2.o $ #notice that c
8 2024-04-08
编程技术问答社区
MinGW的msvcrt替代品?(例如,获得符合要求的snprintf)
所以这是一个有趣的... 我们有一些C库,即使在Linux上开发了,它们也应该独立于平台,因为它们仅依赖于ISO/IEC 9899:1999中定义的C标准库.当我们将这些库与mingw编译时,一开始一切似乎都很好,但是今天我们发现,snprintf()实现msvcrt是braindea ...对不起,我的意思是" 不相容 "具有C99标准中的定义. 我本来会从MINGW发出警告,告诉我-STD = C99实际上并不完全支持.因为否则,我应该怎么知道? Windows是否有其他C标准库,最重要的是:Mingw可以以某种方式链接到它而不是MSVCRT? 吗? 如果没有,我们至少需要一个列表或可以检查有关MSVCRT和C99的其他潜在可移植性问题的内容. ps: 我知道cygwin和msys2,但是我宁愿拥有本机Windows二进制文件(部分是因为我们也在MATLAB中使用库). 编辑: 抱歉,我应该更清楚地解释我对MSVCRT的Snprintf()的问题
6 2024-04-08
编程技术问答社区
使用_crtBreakAlloc查找内存泄漏-标识符"_crtBreakAlloc "未被识别
我试图在中,在手表窗口中使用_crtBreakAlloc 链接,但是价值行说"标识符" _crtbreakalloc是未知的,它根本不起作用. 我在做什么错?我正在使用Visual Studio. 代码的示例: #define _CRTDBG_MAP_ALLOC #include #include #include int main() { int *arr = (int*)malloc(10 * sizeof(int)); //breakpoint here free(arr); return 0; } i然后将_crtbreakalloc写入手表窗口的名称字段,并在遇到断点时命中输入. 解决方案 _crtBreakAlloc是VS2015下的宏,它被呼叫返回指针返回INT的函数的调用.在手表窗口中跟踪变量似乎不是一个选项. 更好地插入(调试)代码类似的代码:
18 2024-04-08
编程技术问答社区
Visual Studio 2015。在没有运行时库的情况下编译C/C++
是否有一种方法可以使用Visual Studio 2015编译C/C ++,而无需使用任何运行时库? 我需要在没有运行时库的情况下进行编译,因为我正在创建自己的运行时库(对于我的操作系统). C/C ++上有选项 - >代码生成 - >运行时库 但是我想要一个说"无"的选项. 我知道丢失了CRT中的许多功能. 解决方案 在没有C-runtime库(CRT)的情况下编译您的应用程序/MT,/NODEFAULTLIB链接器选项,并在Linker -> Advanced -> Entry Point上重新定义输入点Linker -> Advanced -> Entry Point以在您的代码中定义的功能,例如. rawMain.签名是: DWORD CALLBACK rawMain(); 如果没有C-runtime库,则不允许您使用其功能,例如malloc,free,memset等.您应该自己实现所有使用的CRT功能.例如.您可以替换malloc和Virt
8 2024-04-07
编程技术问答社区
crt0.o和crt1.o | | 有什么区别?
最近,我一直在尝试调试一些低级工作,我找不到编译器的crt0.S( avr-gcc ),但我确实找到了crt1.S(以及相应的.o文件). 这两个文件有什么区别? crt1是完全不同的东西吗?他们俩似乎都与"引导"(设置stack frame等)有关,但是为什么要区别? 解决方案 CRT0/CRT1都做同样的事情,基本上是在调用main()之前需要做的(例如初始化堆栈,设置IRQ等).您应该与一个或另一个链接,但不要链接.它们不是真正的库,而是真正的内联汇编代码. 据我了解,CRT有两个"风味" crt1 用于支持构造函数和破坏者的系统(在主和退出之前和之后调用功能).在这种情况下,主被视为普通功能调用. crt0 用于不支持构造函数/破坏器的系统.
22 2024-04-07
编程技术问答社区
如何在进入VC的main()例程之前执行一些代码?
我正在阅读Microsoft的CRT源代码,我可以提出以下代码,在此函数__initstdio1将在main()例程之前执行. 问题是,在输入VC中的Main(不是VC ++代码)之前,如何执行一些代码? #include #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
6 2024-04-06
编程技术问答社区
我怎样才能在不使用WinMain的情况下编写一个Windows应用程序?
用C/C ++编写的Windows GUI应用程序将" Winmain"作为入口点(而不是" Main").我对此的理解是,编译器生成了C运行时调用的"主"函数.此"主要"功能为GUI设置了必要的环境,并打电话给" Winmain"(指定实例手柄等). . 简而言之,我相信控制台和GUI应用启动在以下方式不同: 控制台应用程序: C运行时 - >'main'函数(手工编码) GUI应用程序: C运行时 - >'main'函数(编译器生成) - >'Winmain'函数(手工编码) 我既要验证这种理解,又找出如何使用"主"功能向Windows GUI进行编码(即不必写" Winmain"). 解决方案 您的理解不正确.除了某些不同的初始化代码外,Main和Winmain之间的区别是传递给它的参数. 主要看起来像这样: int main(int argc, char* argv[]); winmain看起来像这样: int WINAPI W
14 2024-04-06
编程技术问答社区
我如何从fopen FILE结构中获得文件HANDLE?
fopen函数返回指向FILE结构的指针,该结构应视为不透明的值,而无需处理其内容或含义. 在Windows上,C运行时是Windows API的包装器,fopen函数依赖于CreateFile函数. CreateFile函数返回A HANDLE,该>由其他Windows API使用. 现在,我需要使用使用fopen和FILE*的库中深处的Windows API.因此:有没有办法从FILE结构中获取HANDLE?因为这是针对编译器的,所以我的意思是在MSVC运行时库上. 我知道这将是一个丑陋的,不可存放的黑客,如果微软更改FILE>>>的内部格式...但是我正在封闭的系统上开发(即在Windows CE嵌入了嵌入式系统上)系统)和重构图书馆将很困难且耗时. 解决方案 使用_fileno,其次是_get_osfhandle.完成后不要忘记_close它. 编辑:对我而言,_get_osfhandle在Wince上支持_get_osfhandle.但是,win
10 2024-04-06
编程技术问答社区
GNU as, puts works but printf does not
这是我现在正在使用的代码: # file-name: test.s # 64-bit GNU as source code. .global main .section .text main: lea message, %rdi push %rdi call puts lea message, %rdi push %rdi call printf push $0 call _exit .section .data message: .asciz "Hello, World!" 汇编说明:GCC Test.s -o Test 修订1: .global main .section .text main: lea message, %rdi call puts lea message, %rdi call printf
10 2024-03-17
编程技术问答社区
分发VC++运行时文件的正确方法
我有一个MFC应用程序,我正在尝试打包进行部署.它似乎取决于文件" msvcr90.dll"," msvcp90.dll"和" mfc90.dll".分发这些文件的正确方法是什么? 我无法使用合并模块,因为我的安装程序不支持它们. 我知道我可以运行vcredist_x86.exe,但我不想出于各种原因这样做. 据我所知,我唯一的选择是将文件安装为私人并排组件.这是正确的吗? 根据 http://msdn.microsoft.com/en-us/library/ms235317(vs.80).aspx 安装私人程序集的正确方法是将'Microsoft.vc90.crt'和'Microsoft.vc90.mfc'文件夹复制到同一文件夹作为可执行文件.这是解决问题的正确方法吗?它有效,但是以这种方式复制系统文件似乎有点1990.谁能向我展示另一个应用程序的示例(或至少一个演示项目)? 最后,我什么时候需要担心为我的应用程序分发.manifest文件?我应该明确安装XML
12 2024-03-16
编程技术问答社区
如何解决交叉编译中crt0.o的链接问题?
如何添加ctr0.o? 我得到此错误: yagarto-4.7.2/bin/arm-none-eabi-ld: cannot find crt0.o: No such file or directory collect2: error: ld returned 1 exit status` 在/* -- first.s */ /* This is a comment */ .global main /* 'main' is our entry point and must be global */ .func main /* 'main' is a function */ main: /* This is main */ mov r0, #2 /* Put a 2 inside the register r0 */ bx lr /* Return from main */ 我看过这两个线程,没有得到任何完整而直接的答案: t = 50046 背后的理由是什么
44 2024-03-03
编程技术问答社区
如何为_beginthreadex提供一个64位的线程标识符
我正在尝试将某些代码移植到64位,但是_beginthreadex中的线程地址 IS unsigned int中的标识符是32位,我无法通过/从功能中接收64位标识符: uintptr_t _beginthreadex( // NATIVE CODE void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr //
8 2024-01-09
编程技术问答社区
Docker pull error : x509: certificate has expired or is not yet valid
问题描述: 我试图使用此命令将Ubuntu从公共注册表中拉出: docker pull ubuntu 然后我得到了这个结果(昨天上一个命令正在工作): "拉动图像时的错误:get /v1/repositories/library/ubuntu/images :x509:证书已过期或尚未有效" " docker版本: Client: Version: 1.10.0 API version: 1.22 Go version: go1.5.3 Git commit: 590d510 Built: Thu Feb 4 18:36:33 2016 OS/Arch: linux/amd64 Server: Version: 1.10.0 API version: 1.22 Go version: go1.5.3 Git commit: 590d510 Built: Thu Feb 4 18:36:33 2016 OS/Arch: linux/amd64 Dock
28 2023-12-15
编程技术问答社区
如何将.crt转换为.pem
如何将.crt转换为.pem? 解决方案 您可以使用 openssl库进行此转换.可以找到Windows二进制文件在这里 安装了库后,您需要发出的命令是: openssl x509 -in mycert.crt -out mycert.pem -outform PEM 其他解决方案 我发现其他OpenSSL答案对我不起作用,但是以下情况确实如此,与来自Windows的CRT文件. openssl x509 -inform DER -in yourdownloaded.crt -out outcert.pem -text
22 2023-12-15
编程技术问答社区
跨过程边界的CRT类型
我正在执行拖动/掉落Activex控件.在拖动时,我提供了一个CCOMQIPTR,该CCOMQIPTR具有将信息传递到Drop Target的COM方法.在下降时,下降目标的过程调用我的com方法以获取信息. 我不允许使用CRT类型或指针在该接口边界附近的CRT类型附近吗?我希望我的idataObject拥有一个私有的std ::列表和一些std :: strings,并且在界面的外来方面可以调用我的com方法,可以访问这些私人成员. 我认为没关系,因为我实际上不是通过 crt类型. 解决方案 您可以在实现COM对象中使用所喜欢的任何东西,因为它始终保留在创建它的过程(或DLL)中. 您需要在com接口中粘贴com类型,以便可以在使用对象的过程和创建对象的过程之间进行编组. 你是正确的.该文章不适用于这种情况,因为您没有在边界上传递任何东西. COM基础架构涉及为您跨边界上的com类型编组. 只要确保您在com方法中捕获所有例外,就不能允许它们从函数
22 2023-12-06
编程技术问答社区
由于MSVCR110.dll的原因,MS Visual Studio 2012最终没有启动。
当我尝试运行MVS 2012时,我总是会出现错误 - 在库dll msvcr110.dll中找不到过程_cretcreatesymboliclinkw的入口点.我已经从另一台计算机中复制了此DLL文件,但一切都没有帮助.0_O. OS- Windows 7. 解决方案 目前最好的选择是尝试修复Visual Studio安装 控制面板 添加/删除程序 选择Visual Studio,然后选择"维修" 其他解决方案 当前计算机上缺少Microsoft Visual C ++重新分布 从此处下载 http://www.microsoft.com/en -us/download/lidets.aspx?id = 30679
14 2023-12-06
编程技术问答社区
当建立一个DLL时;我应该链接到哪种类型的CRT?
在Windows中;有2个链接到CRT的选项: 多线程,静态链接 多线程,动态链接 有人可以阐明这里的最佳做法是什么?我应该"静态"链接到CRT或进行动态链接? 如果我执行动态链接,并且我编写了一个使用我的DLL +另一个第三方DLL的程序(它在CRT上进行静态链接),这是一个问题吗? 解决方案 当您在应用程序中使用DLL时,这很重要.非常重要的是,EXE和DLL使用相同的内存分配器很重要.如果您从DLL函数中返回指针或C ++对象(例如STD :: String),该功能需要由呼叫者释放.要获取相同的分配器,所有模块必须使用CRT的相同实例.仅当您使用/MD编​​译以选择CRT的DLL版本时,才能得到这一点. 和他们都必须使用相同版本的CRT.无论如何,使用/MT很难诊断内存泄漏,如果幸运的话,访问违规. 使用/MT可以更轻松地部署应用程序,因为您不必安装运行时DLL.如所暗示的那样,只有只需要部署EXE,这才能安全.或当您非常仔细地控制DLL的公共界
14 2023-12-06
编程技术问答社区
fopen_s怎么可能比fopen更安全?
我正在为Windows平台制作旧版代码.当我以VS2013>编译代码时,它会发出以下警告: 错误C4996:'fopen':此功能或变量可能不安全.考虑使用fopen_s.要禁用折旧,请使用_crt_secure_no_warnings.有关详细信息,请参见在线帮助." ,它也会发出sprintf的Samiliar警告.我了解sprintf_s由于缓冲区溢出而比Sprintf更安全. 但是如何 fopen_s 比fopen更安全,因为fopen不接受缓冲区,因此没有机会溢出.谁能提供案例fopen是不安全的,fopen_s是安全的? 解决方案 s在这种情况下不代表"安全",它代表"安全性增强".对于fopen_s,在尝试打开文件之前,请检查参数的有效性. 使用fopen,您可以将零指针传递给文件名,并且一切很可能会掉落在碎片上. fopen_s没有这个问题(a). 请记住,这些范围检查fopen_s之类的接口是ISO标准的可选部分,在附件K中详细介绍
10 2023-12-06
编程技术问答社区
在C++中可选择写到控制台的Windows应用程序?
我想拥有一个具有以下行为的Windows应用程序: 1.如果它是从现有命令行窗口(CMD.EXE)启动的,则将其stdout写入该控制台. 2.如果通过双击其图标启动,它不会打开新的控制台,也不会在任何地方写下其stdout. 要仅实现1,我可以将/SUBSYSTEM链接参数设置为CONSOLE,但是如果我双击应用程序图标,则打开一个新的控制台窗口. 要实现2,我将相同的参数设置为WINDOWS,但是如果我从控制台启动该应用程序,则其stdout并非针对控制台. 我希望相同的可执行文件具有这两种行为. 到目前为止,我发现我可以创建/SUBSYSTEM:WINDOWS可执行文件,然后执行此操作: DWORD ret = AttachConsole(ATTACH_PARENT_PROCESS) if (ret != 0) { // succeeds only if the parent is cmd.exe HANDLE outh = GetStdHan
14 2023-12-05
编程技术问答社区