Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
 Аватар для dilloYa
13 / 13 / 0
Регистрация: 03.09.2012
Сообщений: 44

Exe из ресурсов требует несвойственные для него параметры

09.09.2012, 18:53. Показов 4874. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, помогите, суть проблемы такова. В ресурсы засунула exe файл и в стадии разработки все работает замечательно, файл вытаскивается, запускается и исправно выполняет поставленные ему задачи, но вот после компиляции этот файл отказывается работать, хотя он и вытаскивается из ресурсов и размер у него получается ровно такой же, но вот работать он не хочет. А когда я в ручную начинаю запускать из консоли вытащенную после компиляции прожку, то она просит указать аргументы никакого отношения не имеющие к этой консольной проге и смысл которых мне не понятен.
Миниатюры
Exe из ресурсов требует несвойственные для него параметры  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2012, 18:53
Ответы с готовыми решениями:

Как по exe файлу, получить список dll либ, которые qt exe программа требует для запуска?
Как по exe файлу, получить список dll либ, которые qt exe программа требует для запуска?

Вопрос к искушенным: какая среда IDE для Java удобнее других и требует меньше ресурсов?
Вопрос к искушенным : какая среда IDE для Java удобнее других и требует меньше ресурсов ?

*.exe требует MSVCP100.dll библиотеку для запуска
Всем привет! Написал прогу и столкнулся с такой проблемой как требование библиотеки MSVCP100.dll. Что в этом случае нужно сделать. На...

27
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
09.09.2012, 19:49
Цитата Сообщение от dilloYa Посмотреть сообщение
файл вытаскивается, запускается и исправно выполняет поставленные ему задачи
Цитата Сообщение от dilloYa Посмотреть сообщение
хотя он и вытаскивается из ресурсов и размер у него получается ровно такой же, но вот работать он не хочет
- так надо сравнить содержимое...
0
 Аватар для dilloYa
13 / 13 / 0
Регистрация: 03.09.2012
Сообщений: 44
09.09.2012, 20:33  [ТС]
Catstail, а как это сможет мне помочь решить проблему? И как сравнивать? Открывать в hex-редакторе? Содержимое, уверена, будет в чем то отличным, только что с этим то делать.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
09.09.2012, 20:44
Catstail, имел в виду сравнить хеш-суммы исходного файла (который Вы загружали в ресурсы) и того, что получился после распаковки.

Покажите исходный код распаковщика.
У меня лично вот так:
Visual Basic
1
2
3
4
5
6
7
8
Sub Unpack(fPath$)
Dim oData() As Byte, FF&
oData = LoadResData(101, "CUSTOM")
FF = FreeFile()
Open fPath For Binary Access Write As #FF
Put #FF, , oData
Close #FF
End Sub
Не блокирует ли что антивирус?
У меня AVIRA (причем только она) признала такой скомпилированный файл вирусом.
Мне пришлось отказался от этого способа.
2
10.09.2012, 09:41

Не по теме:

dilloYa, Приятно видеть девушку которая пишет такие слова как:

Цитата Сообщение от dilloYa Посмотреть сообщение
Открывать в hex-редакторе?
Цитата Сообщение от dilloYa Посмотреть сообщение
А когда я в ручную начинаю запускать из консоли вытащенную после компиляции прожку
Особенно когда она понимает о чем вообще идет речь!

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
10.09.2012, 11:37
Цитата Сообщение от dilloYa Посмотреть сообщение
Содержимое, уверена, будет в чем то отличным, только что с этим то делать.
- как, что делать? Искать причину в коде...

Кстати, я для таких целей не использую файлы ресурсов. Есть другой способ. Пусть у нас имеется exe-файл, который нужно запускать из приложения. Я его просто "склеиваю" с exe-файлом приложения (доливаю в самый конец). И дополнительно добавляю 4-х байтовую длину запускаемого файла. Теперь, если нужно запустить встроенный файл, делаем так:
1. Открываем сами себя на чтение в режиме BINARY
2. Определем собственную длину.
3. Позиционируемся в конец файла -4
4. Читаем 4 байта - получаем длину exe-файла
5. Позиционируемся в начало exe-файла, считываем и сбрасываем на диск
6. Запускаем...
2
 Аватар для dilloYa
13 / 13 / 0
Регистрация: 03.09.2012
Сообщений: 44
10.09.2012, 23:22  [ТС]
Dragokas, Антивирус снесла, проблема не решилась. Код распоковщика идентичен вашему, но все же взяла и скопировала ваш код, результат тот же.

Добавлено через 2 минуты
Catstail, Ваш вариант мне интуитивно понятен, но учитывая мой 35 дневный стаж в программировании, для меня это выглядит как страшное заклинание... Буду разбираться
]

Добавлено через 17 минут
И вот небольшой... анамнез программы.
Запускаю программу из проекта и все отработало как надо. Читаю хеш c выгруженного из ресурса, в процесс работы программы, файла. Далее компилирую и после, повторно, запускаю проект. Все опять работает как надо и это понятно. Закрываю проект. Запускаю экзешник, из ресурса программа выгружается, но не работает. Читаю хеш, сравниваю с предыдущим значением и они, конечно же отличны. Но самое интересное и с ума сводящее для меня начинается далее. Я опять открываю проект и запускаю из него программу, но на этот раз уже и из проекта программа из ресурса выгружается битой. Как такое может быть если экзешник и проект используют каждый свой ресурс? Т.е. это происходит только после того, как я запустила экзешник. Исправляется этот баг в проекте элементарно - я просто меняю имя создаваемого файла в который пишется бинарный код -
Visual Basic
1
Open "\tools.exe" For Binary Access Write As #FF
, меняю tools.exe на tool.exe, например. И все опять работает, пока не повторю процедуру с компиляцией и запуском экзешника.. Вот такие дела. Я очень-очень извиняюсь за такую распальцовку проблемы, но ничего лучешего я не придумала, как объясниться.. в полвторого ночи. Надеюсь кто-нибудь поймем о чем я.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.09.2012, 02:31
Мистика.
Как на счет сделать побайтовое сравнение (Total Commender, WinHex ...) и увидеть визуально - чем отличаются... -> сделать выводы.
У меня тоже был битый - типы данных напутал, когда от себя писал.
Но раз Вы скопировали в точности мой код...

Дайте ехе-шник - попробую протестить у себя процесс компиляции.

Добавлено через 2 часа 43 минуты
А еще лучше оба EXE-шника - нормальный и битый (после распаковки).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
11.09.2012, 11:45
Выкладываю проектик. Писался очень быстро (вполне возможны плюшки).

Включает два модуля:

strarter.exe - это запускающая программа (извлекает из своего тела и запускает notepad.exe)
maker.exe - программа, заливающая notepad.exe в starter.exe

При необходимости переделки:

Транслируем starter
Запускаем make.cmd
Запускаем новый starter
Вложения
Тип файла: zip t021.zip (80.2 Кб, 35 просмотров)
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
11.09.2012, 12:28
Дополнение: make не следует вызывать многократно (работать-то будет, но в теле exe будет копиться мусор). Впрочем, эту проблему можно решить (исходники открыты).

Проверил работоспособность под Касперским - работает...
1
 Аватар для dilloYa
13 / 13 / 0
Регистрация: 03.09.2012
Сообщений: 44
11.09.2012, 21:29  [ТС]
Dragokas, вот, во вложении два файла - один оригинальный, другой битый. Собрала маленький тестовый проектик, который только достает из ресурса этот exe. И ничего так и не получается, по прежнему, после компиляции экзешник оказывается битым.
Вложения
Тип файла: zip exiftools.zip (6.65 Мб, 27 просмотров)
0
 Аватар для dilloYa
13 / 13 / 0
Регистрация: 03.09.2012
Сообщений: 44
11.09.2012, 21:36  [ТС]
Catstail, очень очень интересный код. Жалко что коментариев нет, но объем небольшой, надеюсь разберусь. Как использовать его, понятно, но вот как он реализуется совершенно непонятно. А модуль Process.bas для контроля за процессом, так же использую в своем данном проекте, полезнейшая вещь, отдельное спасибо за него
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
11.09.2012, 21:42
Цитата Сообщение от dilloYa Посмотреть сообщение
Жалко что коментариев нет
- завтра напишу!
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.09.2012, 07:31
Цитата Сообщение от dilloYa Посмотреть сообщение
после компиляции экзешник оказывается битым.
Так и невооруженным глазом видно, что размер различается на 1 байт. В конец "битого" файла дописан лишний 0, а в остальном файлы абсолютно одинаковые.
Если внутри файла не производится проверка целостности, то обычно дописывание в конец исполняемого файла любого кол-ва байтов не влияет на работоспособность.
P.S. Интересно, откуда этот 0 берётся?
В любом случае, нам известен точный размер файла, так что можно из ресурсов записывать точное кол-во байт в этот файл.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.09.2012, 11:03
Catstail, при беглом просмотре я как-то и сам не понял, хотя все очень просто. Было бы неплохо с комментариями
Но по какому алгоритму: как он при чтении комбинированного файла находит в нем позицию для чтения байтов размера 2-го файла (откуда берет размер первого)?

Добавлено через ...
Да, не поверил глазам.
Из проекта работает нормально.
Из скомпилированного EXE вытягивает ресурс и дописывает к файлу нули &H00 в таком количестве,
чтобы заполнить 8 байт.

(на скрине Exiftool версии 9.0.2)
Миниатюры
Exe из ресурсов требует несвойственные для него параметры  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
12.09.2012, 20:03
Лучший ответ Сообщение было отмечено как решение

Решение

Вот комментированный код запуска файла, хранящегося в теле другого файла:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Private Sub Command1_Click()
        '::: Определяем домашнюю директорию
        HomeDir$ = App.Path
        '::: Берем свободный номер файла
        fi% = FreeFile
        '::: Открываем сами себя на чтение в двоичном доступе
        Open HomeDir$ + "\" + App.EXEName + ".exe" For Binary Access Read As #fi%
        '::: Определяем собственную длину
        LF& = LOF(fi%)
        '::: Позиционируем файловый указатель на начало последних
        '::: 4-x байтов EXE
        Seek #fi%, LF& - 3
        '::: Читаем длину тела запускаемого файла
        Get #fi%, , Offset&
        '::: Позиционируем файловый указатель на начало
        '::: тела запускаемого файла
        Seek #fi%, LF& - Offset& - 3
        '::: Создаем буфер для тела запускаемого файла
        Buf$ = Space$(Offset&)
        '::: Читаем тело
        Get #fi%, , Buf$
        '::: Закрываем входной файл
        Close #fi%
        '::: Берем свободный номер файла
        fo% = FreeFile
        '::: Открываем в тек. директории файл с каким-либо именем
        Open HomeDir$ + "\notepad.sss" For Binary Access Write As #fo%
        '::: Сбрасываем в файл содержимое
        Put #fo%, , Buf$
        '::: Закрываем
        Close #fo%
        '::: Скрываем форму
        Me.Hide
        '::: Запускаем... и ждем завершения
        Processn.ExecPrg HomeDir$ + "\notepad.sss", "", RC%, vbNormalFocus
        '::: Дождались - покажем форму
        Me.Show
        '::: Удалим запускаемый файл
        Kill HomeDir$ + "\notepad.sss"
        '::: Покажем код завершения
        MsgBox "RC=" + CStr(RC%)
End Sub
А вот комментированный код exe-мэйкера:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Sub Main()
    '::: Äîìàøíÿÿ äèðåêòîðèÿ
    HomeDir$ = App.Path
    '::: Êîìàíäíàÿ ñòðîêà
    CMD$ = Command$
    '::: ïîëîæåíèå ïðîáåëà â êîì. ñòðîêå
    k% = InStr(CMD$, " ")
    '::: íåò ïðîáåëà - îøèáêà
    If k% = 0 Then
       MsgBox "Çàïóñê: maker Ãëàâíûé Çàïóñêàåìûé"
       Exit Sub
    End If
    '::: ïåðâûé ïàðàìåòð - èìÿ ãëàâíîãî ôàéëà
    master$ = Left$(CMD$, k% - 1)
    '::: âòîðîé ïàðàìåòð - èìÿ çàïóñêàåìîãî èç
    slave$ = Mid$(CMD$, k% + 1)
    '::: Ñâîáîäíûé íîìåð ôàéëà
    fi% = FreeFile
    '::: Îòêðûâàåì ãëàâíûé (äëÿ ÷òåíèÿ è çàïèñè!)
    Open HomeDir$ + "\" + master$ For Binary Access Read Write As #fi%
    '::: Ïîëó÷àåì äëèíó
    LFM& = LOF(fi%)
    '::: Ñâîáîäíûé íîìåð ôàéëà
    ffi% = FreeFile
    '::: îòêðûâàåì ïîä÷èíåííûé (òîëüêî äëÿ ÷òåíèÿ)
    Open HomeDir$ + "\" + slave$ For Binary Access Read As #ffi%
    '::: Ïîëó÷àåì äëèíó
    LFS& = LOF(ffi%)
    '::: ñîçäàåì áóôåð äëÿ çàïóñêàåìîãî ôàéëà
    BufS$ = Space$(LFS&)
    '::: ×èòàåì âåñü çàïóñêàåìûé ôàéë â áóôåð
    Get #ffi%, , BufS$
    '::: Ïîçèöèîíèðóåì ãëàâíûé ôàéë â êîíåö
    Seek #fi%, LFM& + 1
    '::: Âûâîäèì áóôåð
    Put #fi%, , BufS$
    '::: âûâîäèì äëèíó (÷òîáû ãëàâíûé ìîã óçíàòü, ñêîëüêî áàéòîâ îò êîíöà íóæíî âçÿòü)
    Put #fi%, , LFS&
    '::: Âñå çàêðûâàåì
    Close
    '::: OK!
    MsgBox "OK!"
End Sub
Добавлено через 13 минут
Некоторые дополнения:

Код можно заметно облагородить. Во-первых, выводить не 4-х байтовую длину, а длину+сигнатуру (по которой можно понять, что файл уже "залит"; в этом случае старый можно изъять, новый залить.) Во-вторых, провести более тщательный анализ командной строки, добавить обработку ошибок и т.д. Ну, и, конечно, заливаемый файл можно:

а) сжать каким-либо упаковщиком (экономия размера);
б) зашифровать;
в) сделать а) и б)
5
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.09.2012, 23:38
Catstail, спасибо. Теперь разобрался. Значит длину 2-го файла позиционируем в конец скомбинированного. А Notepad.SSS с заманчивым расширением на самом деле является EXE-шником.

Цитата Сообщение от Catstail Посмотреть сообщение
добавить обработку ошибок
Это да.
К примеру ExitCode для переменной RC сменить тип на Long.

Мда, AVIRA не палит мою безобидную программу, ранее запакованную в ресурсы,
зато теперь AntiVir и какой-то ByteHero не угодил. Попробую накинуть байтовый сдвиг.

Добавлено через 15 минут
О, нет это была нехорошая идея со сдвигом - теперь результат проверки 9/42 на вирустотале ,
какие же дотошные эти антивирусы.
Склеил EXE ради прикола с мейкером, который вообще не распаковует и не запускает - получил 10/42, хотя каждый файл сам по себе - 0/42, кроме мейкера.
Вывод: лучше хранить файлы отдельно, если это исполнительный.

Кстати результат с подсоединенным ExifTool более хороший - 1/42 = AntiVir.
1
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
13.09.2012, 18:02
Уважаемый Catstail показал в ветке форума как загрузить на лист Экселя и выгрузить exe-файл
https://www.cyberforum.ru/vba/... page2.html
Я выгружаю и затем запускаю exe-файл так:
Visual Basic
1
2
ss = ThisWorkbook.Path & "\" & "mmm.exe"
Shell ss
Все получается и работает. Но вопрос следующий : Как с помощью модуля Process.bas дождаться завершения этого процесса "mmm.exe" и лишь затем продолжить выполнение кода VBA в книге Экселя?
Спасибо за ответ..
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
13.09.2012, 18:17
В состав модуля process.bas входит процедура ExecPrg. Вызов:

Visual Basic
1
       ExecPrg "Имя_модуля","Командная_строка",RC%,winStyle%
Если программа не получает параметров командную строку задавайте пустой. RC% (integer) - это код завершения. Dragokas совершенно справедливо заметил, что его следует сделать длинной целой (long). winStyle - стиль окна (vbNormalFocus, vbMaximized, vbHide и т.д.)

ExecPrg ждет завершения модуля. Код завершения (если он формируется) доступен в RC.
1
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
13.09.2012, 18:39
Цитата Сообщение от Catstail Посмотреть сообщение
В состав модуля process.bas входит процедура ExecPrg. Вызов:

Visual Basic
1
       ExecPrg "Имя_модуля","Командная_строка",RC%,winStyle%
Если программа не получает параметров командную строку задавайте пустой. RC% (integer) - это код завершения. Dragokas совершенно справедливо заметил, что его следует сделать длинной целой (long). winStyle - стиль окна (vbNormalFocus, vbMaximized, vbHide и т.д.)

ExecPrg ждет завершения модуля. Код завершения (если он формируется) доступен в RC.
А "Имя_модуля" - это что? Возможно - Processn ?? Или "mmm.exe" или что то другое?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2012, 18:39
Помогаю со студенческими работами здесь

Почему программа требует больших ресурсов
Я создал простую программу, которая рисует график по формуле, но она занимает 15-20 % использования моего процессора. Если этот результат...

Запрос в процедуре требует параметры
Здраствуйте ! Открываю в процедуре запрос Set rst1 = db.OpenRecordset("qrtmaxizmer1", DB_OPEN_DYNASET), а он требует параметры ....Как...

Биос требует сбросить параметры андервольтинга
Конфигурация Материнская плата: Gigabyte Z170X-Gaming 7 версия BIOS: AMI UEFI F3, 08.03.2015 Процессор: intel core i7-6700K 4.00 GHz ...

Можно ли использовать только exe приложения, не создавая для него установщик
Можно ли, опубликовать программу из VS2013, так чтобы не создавался файл setup, а готовый экзешник, как в делфи

"lsaas.exe недостаточно системных ресурсов для вызова API"
После загрузки windows (XP) компьютер выдавал ошибку: "lsaas.exe недостаточно системных ресурсов для вызова API". Нажимаем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru