· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Прога не стартует с Windows...

Посл.отвђт Сообщенiе


Дата: Апр 6, 2003 07:42:54

Написал небольшую тестовую программу на asm'е,
которая после старта должна удалить файл в
текущей директории(c:\windows), создал ключ
в реестре на автозапуск. Перезапускаю W98
и прога ничего не делает!, вручную удаляет,
почему так? Может есть какие-то специальные
требования для прог, чтоб они запускались вместе
с Windows?


Дата: Апр 6, 2003 11:48:04

все должно работать.
Может быть, не запускается программа?
Или не те параметры передаешь?
напиши строчки, где удаляется файл.


Дата: Апр 6, 2003 18:23:05

Пути на удаление не прописываю, файл должен удаляться
в текущей директории, когда я просто кликаю по нему всё
работает. Делал я и другую простенькую тест. прогу, которая при
старте ищет искомый файл и если нашла выводит MessageBoxA,
она тоже не хочет с Виндами запускаться, когда просто
кликаю всё работает. Что за лажа такая?

.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

.data

_filename db "myfile.exe",0
ttl db "Warning",0
str_out db "File found!",0

.code

start:

invoke exist,ADDR _filename
cmp eax,0
jz _notfound

invoke MessageBoxA, NULL, offset str_out, offset ttl, MB_OK

invoke DeleteFileA, offset _filename

_notfound:

invoke ExitProcess, NULL

end start


Дата: Апр 6, 2003 18:32:58

_filename db "myfile.exe",0
А если поменять на
_filename db "C:\WINDOWS\myfile.exe",0
что тогда?


Дата: Апр 6, 2003 19:55:11

Спасибо, теперь работает! А почему ей нужно
точно путь указать, ведь файл находится
в этой же директории c:\windows и вручную всё
срабатывает?


Дата: Апр 6, 2003 21:09:35

у каждого процесса своя текущая директория. При его запуске она "наследуется" от родительского процесса. Запуская программу из проводника, текущей директорией, разумеется, будет директория запуска. При старте windows текущей директорией может быть, например, системная папка. Поэтому пользуйся SetCurrentDirectory или указывай полный путь.


Дата: Апр 6, 2003 21:57:43

Спасибо!


Дата: Апр 7, 2003 05:34:02 · Поправил: Asterix

Пытаюсь удалить чужой запущенный файл из
своего, для этого добавил в приведённый
выше пример следующие строки:
invoke GetModuleHandle, ADDR _filename
invoke CloseHandle, eax

далее идёт удаление файла.
Но файл почему-то не хочет закрываться, в eax
после GetModuleHandle приходит 0(ноль). Почему?
Где я опять тупанул?


Дата: Апр 7, 2003 07:05:41

Asterix
Где я опять тупанул?
Как и в первом вопросе, Вы не проверяете результат работы функции (в первом вопросе - DeleteFileA, во втором – GetModuleHandle и CloseHandle) и в случае ошибки не анализируете GetLastError.


Дата: Апр 7, 2003 19:18:22

Если _filename не принадлежит адресному пространству вашего модуля (а так оно и есть :), то GetModuleHandle вам не поможет. Можете спросить у товарища Comrade. Где-то был рабочий пример... может здесь!


Дата: Апр 7, 2003 19:29:07 · Поправил: Asterix

Спасибо, посмотрю, попробую.
__________________________________
Посмотрел:
Пример использует функцию TerminateProcess,
где-то я слышал что при таком прибитии процесса
загруженные dll'ки не уведомляются о прикрытии
процесса и остаются в памяти. Нельзя ли нормально
прикрыть файл, используя CloseHandle?


Дата: Апр 12, 2003 08:54:49

пошли WM_DESTROY, будет более чем нормально. Только программа может повозникать.


Дата: Апр 13, 2003 18:07:47

> Asterix: Ты немного напутал. Функция CloseHandle служит для закрытия описателя объекта ядра. Когда ты вызываешь функции (CreateThread, CreateFile, CreateSemaphore и т.д) возвращающие HANDLE, система создаёт т.н. объект ядра, который, помимо всего прочего, ведёт учёт ссылок на него. Кроме этого, в твоём процессе в специальную таблицу добавляется запись с линком на этот системный объект. Так вот HANDLE является, по сути - ID записи в этой таблице. Когда ты вызываешь CloseHandle(...) ты просто напросто удаляешь запись из этой системной таблицы и теряешь связь с этим объектом ядра(он и без тебя живёт) При этом число ссылок на этот объект система уменьшает на единицу. Когда объект ядра больше никому не нужен (число ссылок = 0), он уничтожается системой. Т.о. HMODULE, возвращаемый GetModuleHandle, никакого отношения к CloseHandle не имеет (GetModuleHandle, насколько я помню, вообще возвращает базовый адрес EXE-файла)

P.S. При завершении твоего процесса число ссылок автоматом уменьшается.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068