Написание экстра-маленьких Win32 приложений на С++ от 1 КБ - FAQ
ОГЛАВЛЕНИЕ
FAQ, возникший в результате множества заданных мне вопросов.
Q: Почему программа не линкуется?
A: Попробуйте собрать не debug, а release версию. А если вам нужна возможность отладки, воспользуйтесь обычными #define. И все-таки есть еще одни вариант. В отладочной версии линкер не может собрать файл потому, что не находит "__chkesp", которая содержится в "CHKESP.OBJ". Что мы можем сделать? Да взять и заменить тот obj на свой, который будет меньше размером и не будет содержать ненужный нам код.
Q: Как теперь получить переданную командную строку?
A: Ну тут все просто. Пользуйтесь стандартными API. То же самое и для Instance приложения. Вот они - GetCommandLine, GetModuleHandle.
Q: А какой минимальный align возможен?
A: Для того, чтобы ваша программа запускалась нормально в любой версии Windows, используйте 512 байт.
Q: А можно ли делать такими маленькими DLL?
A: Да. Назначьте свою точку входа вместо _DllMainCRTStartup.
Q: А почему пропали функции strcmp, strlen и т.п.?
A: Так как они были реализованы в RTL, теперь вы не можете их использовать. Но это не беда. В модуле kernel есть отличная замена этим функциям. Названия те же, но с буквой "l" вначале. Например - lstrlen, lstrcmp, lstrcat.
Q: А теперь стали недоступны функции работы с памятью - memset, CopyMemory?
A: RTL сам предоставляет интефейс для работы с памятью. Во-первых, чтобы соблюдать снандарт, во-вторых, чтобы упростить работу с памятью в среде Win32. Вот посмотрите на функцию CopyMemory - она на самом деле не является настоящей API функцией. Попробуйте слинковать проект без RTL, в котором используется эта функция. Результат - неудачная попытка линковки - ссылка на _memcpy. Еще один пример - функция new. В среде Win32 вы должы воспользоваться функциями GlobalAlloc, GlobalLoc и т.п. Однако вы можете просто заменить RTL функции своими. В файле add.txt вы можете взять уже готовые функции, если не хотите писать их сами.