使 MS Visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号

Make MS Visual C++ compiler treat Win32 API import calls as (unresolved) external symbols

是否可以让 MS visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号?

换句话说,我需要更改 dword ptr 引用某些 IAT 的调用,例如:

FF 15 00 00 00 00  call        dword ptr [__imp__MessageBoxA@16]

外部符号调用,例如:

E8 00 00 00 00     call        _MessageBoxA@16

这意味着在编译之后我不需要链接,因为显然这是不可能的。因此,作为一个产品,我想获得 (MS) COFF .obj 文件,这些文件包含 Win32 API.

的异常调用

正如问题下的评论所指出的,Win32 API 调用被编译成 call [__imp__xxx] 的原因是 __declspec(dllimport).

因此,要实现问题中的要求,所有 Win32 API 函数都必须在没有 __declspec(dllimport) 的情况下定义。

在Win32头文件中(如WinUser.h)你可以看到所有的函数都是用WINxxxAPI宏定义的,而这些函数又是在apisetcconv.h中定义的。在后面的文件中 WINxxxAPI 宏定义为 DECLSPEC_IMPORT,而后者又定义为 __declspec(dllimport).

因此,实现要求的一种简单方法是使用以下空预处理器定义 (see /D flag) 重新定义 DECLSPEC_IMPORT

/DDECLSPEC_IMPORT=

相当于

#define DECLSPEC_IMPORT

P.S。如果有其他方法,我还是想知道。