Как создать минимальную программу Win32 C без API-интерфейсов Windows в таблице импорта с помощью Visual Studio - PullRequest
2 голосов
/ 23 октября 2019

Я пытаюсь повторить ошибку из устаревшего приложения VB4. Сам EXE не имеет API Windows в таблице импорта;вместо этого они все загружаются из библиотеки времени выполнения VB.

Я хочу воссоздать похожий сценарий, но с использованием C в Visual Studio. Позже я создам свой эквивалент DLL-библиотеки времени выполнения с импортом Windows API, однако первый шаг - убедиться, что в моей таблице EXE нет таблиц API-интерфейсов Windows.

До сих пор я почти все удалил из таблицы импорта. используя / SUBSYSTEM: CONSOLE, удалив все .LIB из Linker -> Input -> Additional Dependencies, и установив для библиотеки времени выполнения многопотоковую отладку (/ MTd).

Однако API-интерфейсы kernel32.dll все еще находятся в таблице импорта. Хотя я понимаю, что / SUBSYSTEM: NATIVE, как правило, для драйверов, я не уверен, что это то, что мне нужно использовать, однако я не смог получить минимальное приложение (то есть, которое запускает, а затем завершает работу без сбоев) для компиляции с этим параметром. .

Если я использую компоновщик -> Ввод -> Игнорировать все библиотеки по умолчанию -> Да (/ NODEFAULTLIB), я получаю следующие ошибки:

Severity    Code    Description Project File    Line    Suppression State   Suppression State
Error   LNK2001 unresolved external symbol _mainCRTStartup  Minimalist  C:\Users\chentiangemalc\source\repos\Minimalist\Minimalist\LINK 1       
Error   LNK2019 unresolved external symbol __RTC_CheckEsp referenced in function _main  Minimalist  C:\Users\chentiangemalc\source\repos\Minimalist\Minimalist\Minimalist.obj   1       
Error   LNK2001 unresolved external symbol __RTC_InitBase   Minimalist  C:\Users\chentiangemalc\source\repos\Minimalist\Minimalist\Minimalist.obj   1       
Error   LNK2001 unresolved external symbol __RTC_Shutdown   Minimalist  C:\Users\chentiangemalc\source\repos\Minimalist\Minimalist\Minimalist.obj   1

Код, который я пытаюсь скомпилироватьне включает в себя и просто:

int main()
{
}

1 Ответ

1 голос
/ 23 октября 2019

Комментарий Раймонда Чена направил меня в правильном направлении. Для создания этой программы в Visual Studio 2019 использовались

  1. Новый проект |Консольная программа C ++
  2. Переименовано .cpp в .c (если вы хотите создать программу C)
  3. Заменен код с пользовательской точкой входа:

    int myMain () {}

  4. В свойствах проекта | Генерация кода C / C ++ установить Базовые проверки времени выполнения на ничто (стереть текст), установить Библиотека времени выполнения на Многопоточную отладку (/ MTd) для сборки отладкиили Многопоточное (/ MT) для сборки выпуска, установите Проверка безопасности на Отключить проверку безопасности (/ GS -)

  5. В свойствах проекта | Линкер | Ввод |удалить все из Дополнительные зависимости и установить Игнорировать все библиотеки по умолчанию в Да (/ NODEFAULTLIB)

  6. В свойствах проекта| Линкер | Дополнительно установить точку входа myMain

Теперь у вас есть программа с полностью пустой таблицей импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...