【问题标题】:Converting a DWORD without CRT, implementing custom sprintf() function在没有 CRT 的情况下转换 DWORD,实现自定义 sprintf() 函数
【发布时间】:2013-06-02 02:50:17
【问题描述】:

背景:

我的应用程序没有 CRT,因为它必须便携且小巧。

问题:

当我在 Windows XP 的虚拟机上运行我的应用程序时,我的 CreateProcess() 函数失败,我需要在 MessageBox() 中显示 DWORD 而不使用任何 CRT,

如何在我的程序中手动实现sprintf() 函数,将DWORD 类型转换为char buffer 以显示在MessageBox() 函数中以获取错误类型,因此我可以修复问题。

我已经实现了自己的memset() 函数

extern "C" void * __cdecl memset(void *, int, size_t);


#pragma function(memset)
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
unsigned char *p = static_cast<unsigned char *>(pTarget);
while (cbTarget-- > 0) {
    *p++ = static_cast<unsigned char>(value);
}
return pTarget;
}

我不确定如何实现自定义sprintf() 函数

谢谢

【问题讨论】:

  • 只是静态链接。链接器会将memcpy 和sprintf 实现复制到您的可执行文件中。您无法避免拥有这些功能的一个版本,那么为什么不选择一个经过良好测试的版本呢?
  • 我的应用程序有大小限制,否则我会。
  • 所以?无论链接器从何处获取这些字节,您的应用程序都将包含 memcpy 所需的字节。
  • 静态链接 CRT 仍然会带来大量你不使用的东西,我猜 LTCG 没那么聪明

标签: c++ c printf msvcrt


【解决方案1】:

wsprintf 在 Windows 中可用,事件没有 CRT。只需#include windows.h

【讨论】:

    【解决方案2】:

    如果速度不是您关心的问题,您可以使用 kernel32.dll 提供的 RtlMoveMemory 和 wsprintf 用于 memcpy(memmove) 和 sprintf(实际上并没有那么慢,只是无法进行链接时间优化)。

    【讨论】:

    • 谢谢我完全忘记了 Win32 中的这个实现
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 2012-08-02
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2021-12-27
    • 2019-01-09
    • 2023-03-09
    相关资源
    最近更新 更多