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



我正在尝试从旧版 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中创建此程序已使用

  1. 新项目 |C++控制台程序
  2. .cpp重命名为 .c(如果要创建 C 程序(
  3. 将代码替换为自定义入口点:

    int myMain(( { }

  4. 在"项目属性"|">C/C++ 代码生成"基本运行时检查"设置为"无"(擦除文本(,将"运行时库"设置为"多线程调试 (/MTd("(对于调试版本(或设置为"多线程 (/MT("(对于发布版本(,将">安全检查"设置为"禁用安全检查"(/GS-(

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

  6. 在"项目属性"|">链接器|高级设置入口点到我的主

现在,您有一个具有完全空的导入表的程序。

相关内容

  • 没有找到相关文章

最新更新