-3

是否可以让 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 进行了如此不寻常的调用。

4

1 回答 1

0

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

因此,要实现问题中提出的要求,所有 Win32 API 函数都必须在没有__declspec(dllimport).

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

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

/DDECLSPEC_IMPORT=

这相当于

#define DECLSPEC_IMPORT

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

于 2017-09-03T13:10:53.893 回答