Всем привет!!! У меня такой вопрос: на win7 не запускатеся файл помещенный внутри моего приложения как ресурс на делфи, т.е. она работала на win XP.
Короче я в проект добавил ресурс внутри которого находится еще один exe-файл (ну поместил его внутри моего приложения) скажем при кликании кнопки на форме этот exe-файл запускался из моего приложения, прога вроде бы работала на WinXp, но не работает на Win7. Что посоветуешь???
Получается я не извлекаю, а сразу запускаю из ресурсов! Этот же код работал на XP Вот код запуска файла из ресурса... implementation {$R Myexe.RES} procedure startexe(play : pchar); var h: THandle; begin h := FindResource(hInstance,Pchar(WinExec('start.exe',SW_SHOWNORMAL)),'exe'); FreeResource(h); end; procedure TForm1.Button1Click(Sender: TObject); begin start('myexefile'); end
Код какой то странный. Он действительно делает то, что предполагается? Есть сомнения. === Во первых: в процедуре Button1Click вызывается функция start, которую ты не привел. Во вторых: в процедуре startexe входящий параметр play нигде не используется. А в третьих... Очень печально, но под XP твой код не должен был работать. Вернее не так, как ты думаешь. Твой код запускает не программу с ресурсов, а файл start.exe, который лежит в одной папке с твоей программой Так что положи файлик start.exe в каталог со своей программой и смотри, как она работала на XP
этот код вообще бредовый! какой "работал на ХР"? просто для FindResource вторым параметром передается переменная типа PAnsiChar, а ты вызываешь программу start.exe, которая лежит в папке с основной программой, функцией WinExec, и результат возвращаемы ею конвертишь в PChar. Это ни в коем случае не является запуском приложения из ресурсов!
вот тут можешь почитать как запустить файл из памяти на асме: http://wasm.ru/article.php?article=memfile
даа, ну этот код почему то работал в XP! Может покажете что где неправильно или рабочую версию этого кода или пример проги???
Нету желания тра*ать себе мозг, так как это не так уж и просто если тебе это так критично нужно, то читай об формате исполняемого файла и работе загрузчика, так как не думаю, что кто-то будет писать код за тебя. но я бы посоветовал тебе извлечь файл во временную директорию и запускать его оттуда, а после завершения удалять
гугли извлечения из ресурсов,потом проверяешь файл который извлек на существование,и запускаешь,примеров извлечения туева хуча
2 cyberkazi можно конечно сразу запустить. Всё очень просто: 1) из ресурсов достаёшь файл и закидываешь кудать в память 2) парсишь PE файл. Выделяя память под образ программы, но по её ImageBase адресу. так что твой ImageBase должен кардинально отличаться от той проги. 3) Выделяешь память под секции и копируешь туда их. не забывая про устновку правильных прав доступа 4) обрабатываешь таблицу импорта, не забывая о IAT и hint 5) правильно настраиваешь PEB и TEB 6) передаешь управления на точку входа в программу. Всё очень просто, буквально строк 500 на Си. Или 600 не делфи ) Так что забудь про это, с твоими знаниями тебе такого не повторить никогда. ну или альтернативный способ: 1) На основе секций PE файла создаешь секции в памяти 2) создаешь TEB, PEB и прочие хрени ручками 3) создаешь новый процесс напрямую через NtCreateProcessEx 4) создаешь удаленный поток на точку входа (остановленный) 5) ставишь APC на виндовую функцию обработки импорта и прочей хрени 6) информинуешь csrss о создание процесса и потока 7) запускаешь поток Вот и готово. Но с этим способом мороки больше чем с первым ). и если первый способ - обычные Api функции, то для второго понадобятся NativeApi и причем не документированные вызовы к csrss