【问题标题】:need help understandinga legacy c code _fmemcpy((LPSTR FAR *)Defdat,(LPSTR FAR *)&DLLdat,sizeof(DATSETTING));需要帮助理解遗留 c 代码 _fmemcpy((LPSTR FAR *)Defdat,(LPSTR FAR *)&DLLdat,sizeof(DATSETTING));
【发布时间】:2015-09-16 13:35:00
【问题描述】:

我正在尝试阅读旧版 dll Visual Studio 项目的 c 代码中的这一行,但我看不懂

_fmemcpy((LPSTR FAR *)Defdat,(LPSTR FAR *)&DLLdat,sizeof(DATSETTING)); 

我正在为 Windows 64 位 Visual Studio 2010 进行编译
图书馆

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <time.h>

谢谢

【问题讨论】:

  • 更多信息怎么样?库、编译器、架构……
  • 你有什么不明白的地方?它是一个 memcpy,指定了自许多版本的 Windows 以来已经过时的指针类型(至少在 X86 中)。在该指针类型过时后的标头中,该指针类型的规范被禁止,您只有一个带有普通指针的普通 memcpy。
  • 感谢所有我将阅读有关 memcpy 和过时的 JSF 解释我希望我能管理它
  • 这应该等同于memcpy(Defdat, &amp;DLLdat, sizeof(DATSETTING));

标签: c++ c legacy


【解决方案1】:

在 16 位窗口时代,指针既可以是数据段内的 16 位指针,也可以同时存储 16 位段选择器和该段内的 16 位地址。后一种指针的术语是 FAR,在不同模块之间传递的任何类型的指针,例如主程序和操作系统或 DLL,都必须使用它们。除了最小的现实世界程序之外,其他所有程序也是如此,如果没有其他程序的话,堆和堆栈会使用不同的段。 LPSTR 是指向字符串的长指针的匈牙利表示法,所以我认为这个程序员是多余的。

曾经有一些用于 FAR 指针的库函数的单独版本,那就是 memcpy() 的版本,它在 16 位 Windows 上的不同段之间复制数据。为了帮助移植代码,它变成了 32 位 Windows 上的宏,扩展为 memcpy()LPSTR 扩展为 char *。 FAR 被忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多