是否有可能使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的这种不寻常的调用。
答案 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。如果有其他方法,我仍然想知道它们。