| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Программа компилируется, но ехе не запускается |
| Автор: Andrej23 19.8.2011, 10:00 |
| Добрый день. Подскажите плз, что за ужасть случилась с моим проектом: сегодня прихожу на работу, включаю vc++ 2005, моя прога компилируется, а отладочный exe запускаться не желает потому что "Unable to start program .....exe". программка - win32 проект под winapi. проверил другие проекты - идут и консольные и оконные. во время компиляции ошибок не пишет. говорит что build sucsess, 0 errors, 0 warnings. Пробовал просто сам ехе запустить через проводник, выскакивает окошко с надписью: ...exe не является приложением win32. Пробовал создать новый проект и туда исходник закинуть, всё равно не запускается. Подскажите плз, в чем может быть дело? Дополнение: Стал разбираться, пошел по истории исходников: неделю назад стал менять структуру программы т.к. нашел логическую нестыковку в модели и как только я начал менять структуру, сразу появилась такая фигня. Просто я не запускал программу пока блоки переделывал (всё равно бестолку), только компилировал чтобы на ошибки проверить. В чем может быть дело? |
| Автор: spyswamp 19.8.2011, 11:06 |
| Манифест. |
| Автор: Andrej23 19.8.2011, 13:16 | ||||
Вот файл rrr.exe.embed.manifest
Вот файл rrr.exe.intermediate.manifest
да, манифесты стандартные (я про них даже и не знал ничего). Прога, которая до изменения структуры вполне себе работает, соответственно манифесты там генерируются правильно, после изменения exe не включается. |
| Автор: Andrej23 19.8.2011, 14:41 |
| Посмотрел манифест файлы той версии, которая работает - они точно такие же. Наверное дело в чем-то другом. при пересоздании ехе пишется такая строка: LINK : C:\cpp\r_r\Debug\r_r.exe not found or not built by the last incremental link; performing full link |
| Автор: spyswamp 19.8.2011, 16:44 |
| А ты как пересобираешь? Clean/Rebuild? Попробуй еще вручную весь интермидиэйт стереть. |
| Автор: Andrej23 19.8.2011, 17:17 |
| стер содержимое папок debug, снова нажал Rebuild, результат тот же. |
| Автор: Estranged 19.8.2011, 22:04 |
| Может быть собранный exe не win32, а win64 или еще что. Поглядеть на него pe просмотрщиком надо бы. |
| Автор: volatile 20.8.2011, 02:12 |
В main вначале пишете: return 0; компилируем, Если опять не запускается, то копать опции проекта. Если запускается, убираем return 0; и дебагером... |
| Автор: Andrej23 20.8.2011, 10:02 | ||
| Спасибо, return 0 сегодня попробую. Иначе похоже придется отсекать куски программы чтобы понять из-за какого куска неправильно компилируется. (возможно где-то в структуре классов получилась циклическая ссылка друг на друга. не факт, но как вариант).
Эта прога, вариант неделей раньше запускается (в этом же проекте просто перезаписываю cpp файл). Св-ва проекта не менял. Только изменил структуру классов и дописал несколько функций. Сам проект win32. А как включить репросмотрщик и что это? |
| Автор: Andrej23 22.8.2011, 10:36 |
| проверил return 0; первой строкой в tWinMain() - результат не изменился. Вчера попробовал скомпилировать этот же проект на VS 2008, а не на 2005 - выдало ошибку что не хватает database ' ' (может это как-то поможет). Посмотрел через Depends view: IESHIMS.DLL не удается найти указанный файл (2) WER.DLL не удается найти указанный файл (2) MPR.DLL просто значок красный (может активный?) Warning: At least one delay-load dependency module was not found. Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. этот IESHIMS.DLL и wer.dll вызываются из setupapi.dll-> shell32.dll -> shdocvw.dll -> mshtml.dll -> iframe.dll Дополнение: посмотрел exe файл недельной давности. Те же файлы пишутся ненайденными, но всё работает (странно). В mpr.dll функция WNetRestoreConnectionA помечена красным. |
| Автор: GremlinProg 22.8.2011, 11:00 | ||||
http://social.technet.microsoft.com/Forums/en-US/w7itproinstall/thread/8a751f65-ade9-4b8b-a3d3-c720ccbd3d2c/
т.е., я так понимаю на работе стоит что-то выше XP? Добавлено через 4 минуты и 29 секунд хотя, нет, наверное даже не так: компилируется в конфигурации для чего-то выше чем XP (ну и соответственно, на чем-то выше XP, раз сборка таки проходит удачно), а запускается на XP и ниже? Добавлено через 12 минут и 39 секунд
а может все проще: это реально не win32, а WOW64, и это не ошибка приложения, а ошибка совместимости, т.е. этот exe можно запускать только на 64-битных осях |
| Автор: Andrej23 22.8.2011, 13:14 |
| Нет, у меня XP SP3. Прога (вариант неделей раньше) компилируется и запускается на этой же машине, в ней просто заменяю основной cpp файл. Cам проект win32. Делаю без всяких заморочек. VC++ и winapi. Прога со стороны программирования примитивнейшая (расчеты и вывод), никаких изысков. |
| Автор: Andrej23 22.8.2011, 15:33 | ||
| Разобрал прогу, оставил только структуру классов - не работает. Перекинул структуру классов в новый сгенерированный проект (только основное окно и менюшка). Потом стал уже отключать классы по очереди. На одном из классов пограмма заработала. Стал подключать классы обратно - программа всё равно работает. между включениями удалял каталог debug c exe файлом. Единственное, что удалось засечь - это строку LINK : C:\cpp\r_r\Debug\r_r.exe not found or not built by the last incremental link; performing full link когда программа не запускалась. Добавление: замучился. посмотрите плз, в чем дело. Выкладываю максимально урезнный код - часть структуры классов в сгенерированном проекте win32 оконном. Этот вариант компилируется, но не запускается:
|
| Автор: volatile 22.8.2011, 23:44 |
| Покажите как определены макросы, (и определены ли?) _WIN32_WINNT WINVER Скорей всего, дело в них. Они находятся либо в "stdafx.h" либо в "targetver.h" Также определить этот макрос можно с помощью параметра компилятора /D, так что и командную строку не помешает посмотреть. |
| Автор: Estranged 22.8.2011, 23:47 |
| Andrej23, Вы бы лучше уменьшили размер глобальных переменных. Они только кажутся слишком малыми, на практике же: DTable<MND> DemTbl; - 1600024 байт DTableDDS<MNAD*2> DemDeltaStatus; - 176024 байт Trades TrdTbl; - 1040024 байт DTablePointers<MND> DemTblQ; - 1640024 байт DTablePointers<MNAD> ActDem; - 82024 байт Tick LastPrice; - 80 байт Это еще худо-бедно помещается кое-как. Ну а res просто разрывает даже x64: res res1; - 2081328344 байт, да, все верно, почти 1.9 гб. Что в сумме всем другим барахлом превышает предел в 2 гб для win32. Отчего все dll и проче-прочее полезное просто не помещается в оставшееся свободное пространство памяти. res все занимает Только через new (malloc/VirtualAlloc не помогут, там конструкторы не вызываются) и x64 можно это чудо запустить. Если не верите, уберите res из переменных и напишите где-нибудь sizeof (res); в программе, в том же _tWinMain, поглядеть своими глазами. Только Clean/Rebuild надо бы сделать поле того, как уберете res, а то мало ли, знаем мы эту инкрементальную сборку. |
| Автор: Dem_max 23.8.2011, 05:31 |
| видимо каждый инкремент-билд это не менее 2 гигов на диске |
| Автор: Andrej23 23.8.2011, 08:33 | ||
| stdafx.h Там ничего там не правил, всё генерировалось vs2005
Estranged, спасибо. Я уж думал, там какой-то класс залезает в память другого класса (грешил на шаблоны классов). Странно только, что так много места занимает. Не хотел делать массивы через new delete, надеялся обычными обойтись. похоже придется. Т.е. дело в res оказалось... буду думать как его поменьше построить. Спасибо всем ответившим, я уж не знал что и думать... месяц работы, 100kb кода. |
| Автор: spyswamp 23.8.2011, 14:47 |
| О, как раз пару дней назад столкнулся с таким же (правда, я dll собирал) - обычный масиив слишком большой. Зашел написать, а тут уже. |