Кажется понял. Если я с помощью malloc() выделяю память для строки и записываю в это пространство строку с помощью strcpy() то она находится в куче. Так? А если вторым способом, не используя malloc() для строки, где в памяти фактически будет находиться строка? Где нибудь в секции rdata, в самой программе? Строка же известна до компиляции. Это всё справедливо для константной строки.
А как быть со строкой которую программа получает во время выполнения? Например это название какого-то файла который она нашла на диске. Тогда только с помощью динамического выделения памяти?
Евгений Шатунов, ладно, экономию места оставим. Здесь уже дело принципа. Я хочу докопаться, как в VS получить PE с единственной секцией. Всё же как-то можно, ведь такая программа работать будет.
Я взял FASM, скомпилировал простую программу из шаблона и в HEX-редакторе вручную слил секцию .idata с .text и поправил адреса. И всё работает.
Вот ссылка на exe, если интересно.
Как такое сделать средствами Visual Studio?
Евгений Шатунов, зачем? Экономия места, пусть и совсем немного. Если бы я понимал чем это грозит, я бы и не задавал вопрос. Но я не вижу здесь проблем. Я так понимаю, что это таблица импорта остается в .idata. Но почему VS не позволяет объединить её с .text? Просто интересно, дело в настройках VS или такое провернуть в VS в принципе невозможно?
Сейчас попробовал вынести строку VARIANT vari; перед main и в исключении изменилось сообщение: Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Далее если я жму кнопку "Продолжить", то в hr попадает сообщение об ошибке: hr = E_INVALIDARG One or more arguments are invalid.
Что-то с аргументами, но что?
Сергей Горностаев, например берем этот код. Если компилировать как С++, то всё ОК, хотя задание создается, но в планировщике его нет, это тоже вопросс... Так вот, если я переключаюсь в компиляцию С, то выделяет первый (CLSID_CTaskScheduler) и четвертый (IID_ITaskScheduler) параметры функции CoCreateInstance, а в списке ошибок выдает следующее:
spoiler
Ошибка (активно) E0167 аргумент типа "GUID" несовместим с параметром типа "const IID *const" test C:\projects\test\test\main.c 24
Ошибка (активно) E0167 аргумент типа "IID" несовместим с параметром типа "const IID *const" test C:\projects\test\test\main.c 27
Ошибка C2440 функция: невозможно преобразовать "const CLSID" в "const IID *const " test c:\projects\test\test\main.c 24
Предупреждение C4024 CoCreateInstance: различные типы для формального и фактического параметров 1 test c:\projects\test\test\main.c 24
Ошибка C2440 функция: невозможно преобразовать "const GUID" в "const IID *const " test c:\projects\test\test\main.c 27
Предупреждение C4024 CoCreateInstance: различные типы для формального и фактического параметров 4 test c:\projects\test\test\main.c 27
А как быть со строкой которую программа получает во время выполнения? Например это название какого-то файла который она нашла на диске. Тогда только с помощью динамического выделения памяти?