【问题标题】:Pseudo variable伪变量
【发布时间】:2012-05-21 20:23:29
【问题描述】:

谁能解释一下什么是伪变量,下面的函数 WinMain 的第一个参数到底是什么??

GetStartupInfo(&StartupInfo);
int nMainRetVal = WinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineAnsi,
   (StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
      ? StartupInfo.wShowWindow : SW_SHOWDEFAULT);

下面的语句还有什么作用??

extern "C" const IMAGE_DOS_HEADER __ImageBase;

【问题讨论】:

    标签: windows executable exe portable-executable


    【解决方案1】:

    WinMain的第一个参数是所谓的“应用实例句柄”。这个东西起源于古老的 Windows 3.x 时代,它表示应用程序正在运行的实例的句柄。但是从Win32开始(Windows 9x/NT)这个参数是进程虚拟地址空间中可执行模块映射的基地址。

    所以,你看到的是图像基地址__ImageBase,它被转换为HINSTANCE以满足WinMain签名。

    现在,__ImageBase - 我猜它是构建时生成的结构,它恰好位于映像起始地址。

    而且,我不确定什么是“伪变量”。但也许这正是__ImageBase

    【讨论】:

      【解决方案2】:

      __ImageBase 是"current module's HINSTANCE from a static library"。这是链接器提供的所谓的伪变量。这个伪变量是模块在内存中加载的地址。使用此伪变量,您可以直接从内存中访问映射的图像并寻址其内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2012-04-02
        • 2012-04-20
        • 1970-01-01
        相关资源
        最近更新 更多