Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2011, 12:37   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
Восклицание вызов из контекстного меню

Нужно вызвать программу из контекстного меню.
Для этого первоначально нужно сделать setup.exe, которая пропишет нужные изменения в реестре.
Я попробовал так сделать
Код:
.686
.model flat, stdcall
option casemap :none; 
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
;подключаем библиотеки
includelib \masm32\lib\kernel32.lib;includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
 
.data 
        hKey_1 DD ?; контекстного меню
        hKey_2 DD ?; запуска
        strPath DB "*\\____delete_",0
        strPathCommend DB "*\\____delete_\\Command",0
        strNameOfKey    DB "Key",0
        strName1 DB "УДАЛЕНИЕ", 0
        strName2 DB ""C:\____delete.exe""%1"",0
        
.code
Start:
        var1_forRegCreateKey    equ     dword ptr [ebp-4]       ;здесь будет информация о состоянии
        ;создаём ключ для контекстного меню
        invoke RegCreateKeyEx, HKEY_CLASSES_ROOT, strPath, 0, strNameOfKey, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
                0, offset hKey_1, offset var1_forRegCreateKey
        ;задаём значение ключа
        invoke RegSetValueEx, hKey_1, strName1, 0, 8
                
        
        ; для запуска
        invoke RegCreateKeyEx, HKEY_CLASSES_ROOT, strPathCommend, 0, strNameOfKey, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
                0, offset hKey_2, offset var1_forRegCreateKey
        ; значение 
        invoke RegSetValueEx, hKey_2, strName2, 0, 23
                
end Start
Да вот только MASM32 уж очень сильно на мою писанину ругается.
Для продолжения работы (так как пока что у меня не получилось setup написать), я сделал саму прогу, и все изменения в реестре вручную прописал:
1. Создал папку HEKY_CLASSES_ROOT//*//____delete
В ней по умолчанию был создан файл. В качестве значения я прописал строку, которая будет выплывать при клике правой кнопкой мыши по файлу.
В этой папке я создал папку command, в которой по умолчанию был создан файл. Присвоил значение
"C:\masm32\bin\____delete.exe"" %1"
Вот сам листинг

http://zalil.ru/31398963

Ошибка при создании файла. Вероятно, я криво с путём к файлу работал. Хотя MessageBox-ом вывел, вроде всё нормально. Подскажите, пожалуйста, что не так и как исправить. Заранее спасибо.
Dimarik вне форума Ответить с цитированием
Старый 09.07.2011, 17:54   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

1. Что значит при создании файла. Там файл не создаётся, а открывается существующий.

2. После вызова MessageBox регистр eax конечно же уже не содержит адрес строки, поэтому при вызове CreateFile и возникает ошибка.

И как то вообще сумбурно. Я мало чего понял. То вы файл какой то открываете, то его же удаляете. То в реестре какие-то файлы с папками создаёте. В реестре нет файлов и папок. В реестре есть разделы и параметры. То какой-то setup пишите. И чего именно из этого не получается?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.07.2011, 18:20   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

с MessageBox спасибо.
Теперь про реестр. Вот хочу я написать утилиту, которая будет удалять файлы. Ну типа стандартного удаления. Так, ради интереса.
Для того, чтобы при щелчке правой кнопкой мыши появлялся соответствующий пункт меню, необходимо это всё дело прописать в реестре. В ручную я это прописал так:
Создал раздел HEKY_CLASSES_ROOT//*//____delete
В ней по умолчанию был создан файл. В качестве значения я прописал строку, которая будет выплывать при клике правой кнопкой мыши по файлу.

Далее необходимо чтобы этот пункт меню был каким-то образом связан с программой. Для этого в этом разделе я создал раздел command, в котором по умолчанию был создан файл. Присвоил значение
"C:\masm32\bin\____delete.exe"" %1"

Всё работает. Теперь же хочу написать setup.exe, который все эти действия выполнит автоматически. Код привёл в первом своём посте, правда код пока что не работающий.
Dimarik вне форума Ответить с цитированием
Старый 09.07.2011, 21:24   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

У меня (на XP) ваш вариант не работает вообще. Там должен быть ещё раздел shell. Вот накидал программку, посмотрите, может чем поможет. Правда я там использовал раздел HKEY_LOCAL_MACHINE\SOFTWARE\Classes - но это отображение HKEY_CLASSES_ROOT. Программка выводит размер файла в MessageBox. Пути к экзешникам естественно мои, надо будет поправить.
Вложения
Тип файла: rar getFileSize.rar (3.9 Кб, 10 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.07.2011, 22:14   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Цитата:
У меня (на XP) ваш вариант не работает вообще.
Просто я на Windows 7 делал.
Спасибо
Dimarik вне форума Ответить с цитированием
Старый 11.07.2011, 20:20   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Всё скопилировалось, однако создаётся только папка ____delete
В ней почему-то не создаётся вложенная папка Command.
И значения ключей реестра не устанавливаются.

http://zalil.ru/31403109

так что тут не так? Можете подсказать?
Dimarik вне форума Ответить с цитированием
Старый 11.07.2011, 21:25   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Код:
invoke RegSetValueEx, hKey_1, strName1, 0, REG_EXPAND_SZ, offset const_forSaveData, 17
offset const_forSaveData - что это? указатель на константу, равную 0?
strName1 - второй парметр функции RegSetValueEx, это указатель на строку, содержащую имя параметра. strName1 - это во первых, не указатель, а во вторых не название параметра, а его значение.
REG_EXPAND_SZ - почему expand, у вас же нет переменных в значении параметра.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 11.07.2011, 22:53   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Код:
.686
	.model flat,stdcall
	option casemap:none
	include \masm32\include\windows.inc
	include \masm32\include\kernel32.inc
	includelib \masm32\lib\kernel32.lib
	include \masm32\include\Advapi32.inc
	includelib \masm32\lib\Advapi32.lib
	include \masm32\include\shell32.inc
	includelib \masm32\lib\shell32.lib
	include \masm32\include\user32.inc
	includelib \masm32\lib\user32.lib
.code
	kontext_path db "*\shell\Delete_nahuy\command\",0
	kontext_key equ $-1
	_one	db ' "%1"',0

start proc
local _size:dword
local cWr:dword
local pKey:dword
local pNumArgs:dword
local my_name[100h]:byte
local buff[1024d]:byte

	lea esi,my_name
	lea ebx,pKey
		invoke RegCreateKey, HKEY_CLASSES_ROOT, offset kontext_path, ebx
	mov ebx,dword ptr[ebx]
	invoke GetModuleFileName,0,esi,sizeof my_name
	invoke lstrcat,esi,offset _one
	invoke lstrlen, esi
	invoke RegSetValueEx,ebx, offset kontext_key, 0, REG_SZ,esi, eax
	invoke RegCloseKey, ebx
	
	xor	esi, esi
	mov	[pNumArgs], esi
	lea eax,pNumArgs
	push eax		
		call	GetCommandLineW
	push eax
	call	CommandLineToArgvW
	mov	ecx, [pNumArgs]
	dec ecx
	jz  ex1
	dec ecx
	jnz ex1	
	mov	eax, [eax+4]
	push eax
		invoke CreateFileW,eax,GENERIC_READ or GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
		inc eax
		jnz ok
			push MB_ICONERROR
			push 0
			push offset _err
			push 0
			call MessageBox
			jmp ex1
			_err db "File locked or you fucked",0
		ok:	
		dec eax
		push eax
			xchg eax,esi
			invoke GetFileSize,esi,0
			mov dword ptr[_size],eax
			push sizeof buff
			pop ecx
			lea ebx,cWr			
			next:			
				lea edi,buff										
				push 0
				push ebx
				push ecx
				push edi
				push esi			
					@@:
						rdtsc
						stosb
					loop @b	
				call WriteFile
				mov ecx,dword ptr[ebx]	
				sub [_size],ecx
				js @f
			jmp next
			@@:
		call CloseHandle					
	;call DeleteFileW		
ex1:
invoke	ExitProcess,0
start endp
end start
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 12.07.2011, 11:39   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Спасибо. Но только один косяк с этой функцией остался
;задаём значение ключа
iinvoke RegSetValueEx, hKey_1, offset strName1, 0, REG_SZ, offset const_forSaveData, 18
где теперь const_forSaveData=REG_SZ
Dimarik вне форума Ответить с цитированием
Старый 12.07.2011, 12:55   #10
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

вопрос непонятен, косяки с функциями - на мсдн
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
eX-Tools v3.4.1 Набор программ для контекстного меню Blourid Софт 0 16.08.2010 15:26
отключить возможность вызова контекстного меню artemavd Microsoft Office Word 0 04.06.2010 17:50
Заблокировать пункт контекстного меню в excel 2007 Mint86 Microsoft Office Excel 13 25.05.2010 15:04
Как запретить отображение контекстного меню kovalevskivf Microsoft Office Excel 2 10.05.2009 15:18
При создание edit, в режиме run-time, нет стандартного контекстного меню slips Общие вопросы Delphi 6 08.11.2008 17:05