Что нового

Определить путь к ярлыку

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Возможно ли в программе получить путь к ярлыку, который ее запустил?
Спасибо.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
madmasles
Я могу ошибаться, но здесь, кажется, то что Вам нужно. Пункт: Detect if an executable was started from a Short-Cut.
Код, правда, на С
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
VladUs,
Спасибо.
Похоже, это то, что мне нужно, только перевести это на AutoIt сам я не смогу... :(
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
VladUs [?]
но здесь, кажется, то что Вам нужно. Пункт: Detect if an executable was started from a Short-Cut.
Используя код с этой страницы, у меня получилось следующее:
Код:
#include <StructureConstants.au3>

$sShortcut = _Start_Shortcut()
If @error Then
	MsgBox(16, 'Error', 'Error')
	Exit
Else
	If $sShortcut Then
		MsgBox(64, 'Info', 'Процесс запущен ярлыком' & @LF & 'Путь к нему: ' & $sShortcut)
	Else
		MsgBox(64, 'Info', 'Процесс запущен' & @LF & 'не ярлыком')
	EndIf
EndIf


Func _Start_Shortcut()
	Local $t_Startup, $b_Flag, $STARTF_TITLESHORTCUT = 0x800, $iMAX_PATH = 260, $t_Title, $s_ShortcutPath

	$t_Startup = DllStructCreate($tagSTARTUPINFO)
	DllStructSetData($t_Startup, 'Size', DllStructGetSize($t_Startup))
	DllCall('kernel32.dll', 'none', 'GetStartupInfoW', 'ptr', DllStructGetPtr($t_Startup))
	If @error Then Return SetError(1, 0, -1)
	$b_Flag = DllStructGetData($t_Startup, 'Flags')
	If BitAND($b_Flag, $STARTF_TITLESHORTCUT) Then
		$t_Title = DllStructCreate('wchar ShortcutPath[' & $iMAX_PATH + 1 & ']', DllStructGetData($t_Startup, 'Title'))
		$s_ShortcutPath = DllStructGetData($t_Title, 'ShortcutPath')
		If $s_ShortcutPath Then
			Return SetError(0, 0, $s_ShortcutPath)
		Else
			Return SetError(1, 0, -1)
		EndIf
	Else
		Return SetError(0, 0, 0)
	EndIf
EndFunc   ;==>_Start_Shortcut

Я не знаю, правильно это или нет, но проверял на XP и 7 х86 и 7 х64, вроде работает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
madmasles [?]
Я не знаю, правильно это или нет
Помоему вроде правильно.

P.S
Нужно Yashied'у указать на этот пример, может в WinAPIEx добавит функцию типа _WinAPI_GetStartupInfo.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
А почему в
Код:
DllCall('kernel32.dll', 'long', 'GetStartupInfoW', 'ptr', DllStructGetPtr($t_Startup))

тип возвращаемого значения стоит 'long'? По идее должно 'None'.
В MSDN написано, что функция GetStartupInfo() ничего не возвращает.
Хотя и так все работает... :smile:
 
Верх