我正在尝试从旧版 VB4 应用程序中复制错误。EXE 本身在导入表中没有任何 Windows API;相反,它们都是从 VB 运行时 DLL 加载的。
我想重新创建一个类似的场景,但在Visual Studio中使用C。稍后,我将使用 Windows API 导入创建运行时 DLL 的等效项,但第一步是确保我的 EXE 中的导入表中没有 Windows API。
到目前为止,我已经使用/SUBSYSTEM:CONSOLE 从导入表中删除了几乎所有内容,删除了所有 .来自链接器的 LIB ->输入 -> 其他依赖项,并将运行时库设置为多线程调试 (/MTd(。
但是 kernel32.dll API 仍在导入表中。虽然我意识到/SUBSYSTEM:NATIVE 通常用于驱动程序,但我不确定这是否是我需要使用的,但是我无法获得最小的应用程序(即启动然后退出而不会崩溃的应用程序(使用该选项进行编译。
如果我使用链接器 -> 输入 -> 忽略所有默认库 -> 是 (/NODEFAULTLIB(,我会收到以下错误:
Severity Code Description Project File Line Suppression State Suppression State
Error LNK2001 unresolved external symbol _mainCRTStartup Minimalist C:UserschentiangemalcsourcereposMinimalistMinimalistLINK 1
Error LNK2019 unresolved external symbol __RTC_CheckEsp referenced in function _main Minimalist C:UserschentiangemalcsourcereposMinimalistMinimalistMinimalist.obj 1
Error LNK2001 unresolved external symbol __RTC_InitBase Minimalist C:UserschentiangemalcsourcereposMinimalistMinimalistMinimalist.obj 1
Error LNK2001 unresolved external symbol __RTC_Shutdown Minimalist C:UserschentiangemalcsourcereposMinimalistMinimalistMinimalist.obj 1
我尝试编译的代码没有包含,只是:
int main()
{
}
Raymond Chen的评论让我朝着正确的方向前进。在Visual Studio 2019中创建此程序已使用
- 新项目 |C++控制台程序
- .cpp重命名为 .c(如果要创建 C 程序(
-
将代码替换为自定义入口点:
int myMain(( { }
-
在"项目属性"|">C/C++ 代码生成将"基本运行时检查"设置为"无"(擦除文本(,将"运行时库"设置为"多线程调试 (/MTd("(对于调试版本(或设置为"多线程 (/MT("(对于发布版本(,将">安全检查"设置为"禁用安全检查"(/GS-(
-
在"项目属性"|">链接器|输入|从">其他依赖项"中删除所有内容,并将"忽略所有默认库"设置为"是"(/NODEFAULTLIB(
-
在"项目属性"|">链接器|高级设置入口点到我的主
现在,您有一个具有完全空的导入表的程序。