如何使用Visual Studio在导入表中创建没有Windows API的最小Win32 C程序

How To Create Minimal Win32 C Program with no Windows APIs in Import Table with Visual Studio

我正在尝试从旧版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)我得到以下错误:

1
2
3
4
5
6
7
8
9
Severity    Code    Description Project File    Line    Suppression State   Suppression State
Error   LNK2001 unresolved external symbol _mainCRTStartup  Minimalist  C:\\Users\\chentiangemalc\\source\
epos\\Minimalist\\Minimalist\\LINK 1      
Error   LNK2019 unresolved external symbol __RTC_CheckEsp referenced in function _main  Minimalist  C:\\Users\\chentiangemalc\\source\
epos\\Minimalist\\Minimalist\\Minimalist.obj   1      
Error   LNK2001 unresolved external symbol __RTC_InitBase   Minimalist  C:\\Users\\chentiangemalc\\source\
epos\\Minimalist\\Minimalist\\Minimalist.obj   1      
Error   LNK2001 unresolved external symbol __RTC_Shutdown   Minimalist  C:\\Users\\chentiangemalc\\source\
epos\\Minimalist\\Minimalist\\Minimalist.obj   1

我要编译的代码没有包含,而只是:

1
2
3
int main()
{
}


Raymond Chen的评论使我朝着正确的方向前进。若要在Visual Studio 2019中使用

创建此程序

  • 新项目| C控制台程序
  • 将.cpp重命名为.c(如果要创建C程序)
  • 使用自定义入口点替换的代码:

    int myMain()
    {
    }

  • 在"项目"属性中| C / C代码生成将基本运行时检查设置为空(擦除文本),将运行时库设置为多线程调试(/ MTd)进行调试构建,或者将多线程(/ MT)进行发布版本,将安全性检查设置为禁用安全性检查(/ GS-)

  • 在"项目"属性中|链接器|输入|从其他依赖项中删除所有内容,并将忽略所有默认库设置为是(/ NODEFAULTLIB)

  • 在"项目"属性中|链接器|将高级入口点设置为myMain

  • 您现在有了一个带有完全空的导入表的程序。