Winapi Get.lib地址

Winapi Get.lib地址,winapi,assembly,linker,import,Winapi,Assembly,Linker,Import,我目前正在学习链接/编译是如何工作的,刚刚谈到了关于导入.exe文件的主题。我发现(Microsoft)链接器可能需要Win32 SDK中的.lib文件来解析外部函数。例如,如果您想从user32.dll使用MessageBoxA,您实际上需要_MessageBoxA@16user32.lib中的地址来解析它。那么,用户/程序员如何才能找到我需要解决它的“前缀”?!(与其他User32/Kernel32函数一样…_MessageBoxA@16编译器根据WinUser.h#include文件中的声

我目前正在学习链接/编译是如何工作的,刚刚谈到了关于导入.exe文件的主题。我发现(Microsoft)链接器可能需要Win32 SDK中的.lib文件来解析外部函数。例如,如果您想从
user32.dll
使用
MessageBoxA
,您实际上需要
_MessageBoxA@16
user32.lib中的地址来解析它。那么,用户/程序员如何才能找到我需要解决它的“前缀”?!(与其他User32/Kernel32函数一样…

_MessageBoxA@16编译器根据WinUser.h#include文件中的声明生成的符号。它是一个修饰名,下划线和@postfix用于声明为u stdcall的函数。名称修饰有助于在链接时捕捉声明错误。但实际上并没有用于winapi函数,它们有未修饰的名称。主要是为了方便使用GetProcAddress()

User32.lib不是普通库,它是一个导入库。它不包含MessageBoxA的代码,它只包含user32.dll导出的所有函数的列表。它包含编译器生成的名称的映射_MessageBoxA@16它实际上是从user32.dll MessageBoxA导出的。Microsoft在构建user32.dll时使用了“模块定义文件”来创建此映射


链接器使用user32.lib解析符号。它从导入库知道如何使用导出函数的正确名称在EXE中创建导入表项。

谢谢您提供的信息。但这仍然不能解释如何找到user32.lib或kernel32.lib等函数的名称。它可能是在WinUser.h中定义的,但作为程序员,没有WinUser.h怎么能找到名称?!某处有纪录片吗?是的,有,我在回答中多次使用了“地图”这个词。请按照我为.def文件提供的链接查看这些映射是如何创建的。我想您可能误解了我的问题。假设我想使用函数VirtualAlloc,它在.obj文件中声明为“VirtualAlloc”外部,可能会导致错误或根本不导入。实际上我必须使用_VirtualAlloc@16或者我甚至可以使用_VirtualAlloc@900或_VirtualAlloc@12345. 那我怎么知道哪个是正确的名字?你不能用_VirtualAlloc@900,因为该函数不存在。答案是准确的,因为16是参数的字节数。