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

时间:2017-09-03 12:11:37

标签: winapi assembly compilation symbols coff

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

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

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的这种不寻常的调用。

1 个答案:

答案 0 :(得分:0)

正如问题评论中指出的那样,将Win32 API调用编译为call [__imp__xxx]的原因是__declspec(dllimport)

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

在Win32头文件(例如WinUser.h)中,您可以看到所有函数都是使用WINxxxAPI宏定义的,而apisetcconv.h宏又定义在WINxxxAPI中。在后面的文件DECLSPEC_IMPORT中,使用__declspec(dllimport)定义了宏,而DECLSPEC_IMPORT定义为/DDECLSPEC_IMPORT=

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

player.setPlayWhenReady(true);

相当于

player.setPlayWhenReady(false);

P.S。如果有其他方法,我仍然想知道它们。