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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2013, 15:56   #1
CantStop0708
 
Регистрация: 08.01.2013
Сообщений: 3
Вопрос Создать ярлык на рабочем столе в win 7 мешает UAC

Здравствуйте! Пытаюсь создать ярлык на рабочем столе. Для этого использую приведенную ниже функцию.

Код:
// Creating shortcut 
// Input parameters: 
//  pwzShortCutFileName - path and name of shortcut, for example "C:\\Notepad.lnk" 
//	if no path specified then shortcut will be created at the directory specified at the next parameter
//  NOTE: Windows will not automatically add the '.lnk' expansion to the file name.
//	pszPathAndFileName  - path and name of .exe file, for example "C:\\Windows\\NotePad.Exe" 
//	pszWorkingDirectory - working directory, for example "C:\\Windows" 
//	pszArguments        - arguments of command line, for example "C:\\Doc\\Text.Txt" 
//  wHotKey             - hot key, for example for Ctrl+Alt+A     HOTKEY(HOTKEYF_ALT|HOTKEYF_CONTROL,'A') 
//  iCmdShow            - start look, for example, SW_SHOWNORMAL 
//  pszIconFileName     - path and name of file that contains the icon, for example "C:\\Windows\\NotePad.Exe" 
//  int iIconIndex      - index of icon at the file, starts from 0 
bool __fastcall CreateShortCut
	( 
	LPWSTR pwzShortCutFileName, 
	LPTSTR pszPathAndFileName, 
	LPTSTR pszWorkingDirectory, 
	LPTSTR pszArguments, 
	WORD wHotKey, 
	int iCmdShow, 
	LPTSTR pszIconFileName, 
	int iIconIndex
	) 
{ 
	IShellLink * pSL; 
	IPersistFile * pPF; 
	HRESULT hRes; 
	
	hRes = CoInitializeEx(NULL, /*COINIT_MULTITHREADED*/COINIT_APARTMENTTHREADED);
	if( SUCCEEDED(hRes) ) 
	{ 
		hRes = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&pSL); 
		if( SUCCEEDED(hRes) ) 
		{ 
			hRes = pSL->SetPath(pszPathAndFileName); 
			if( SUCCEEDED(hRes) ) 
			{ 
				hRes = pSL->SetArguments(pszArguments); 
				if( SUCCEEDED(hRes) ) 
				{ 
					hRes = pSL->SetWorkingDirectory(pszWorkingDirectory); 
					if( SUCCEEDED(hRes) ) 
					{ 
						hRes = pSL->SetIconLocation(pszIconFileName,iIconIndex); 
						if( SUCCEEDED(hRes) ) 
						{ 
							hRes = pSL->SetHotkey(wHotKey); 
							if( SUCCEEDED(hRes) ) 
							{ 
								hRes = pSL->SetShowCmd(iCmdShow); 
								if( SUCCEEDED(hRes) ) 
								{ 
									hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF); 
									if( SUCCEEDED(hRes) ) 
									{ 
										hRes = pPF->Save(pwzShortCutFileName,TRUE); 
										pPF->Release(); 
									} 
								} 
							} 
						} 
					} 
				} 
			} 
			pSL->Release(); 
		}
	}
	CoUninitialize();

	return SUCCEEDED(hRes); 
}
Для получения пути к рабочему столу использую следующий код:
Код:
// path to the All Users desktop:
TCHAR tszDeskPath[MAX_PATH]; 
SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, tszDeskPath);
Ну и в конце концов создаю ярлык приблизительно следующим образом
Код:
// path to the shortcut
std::wstring shortcutPath = tszDeskPath; 
shortcutPath += L"\\Notepad.lnk";

// creating shortcut:
CreateShortCut((LPWSTR)shortcutPath.c_str(), L"C:\\Windows\\NotePad.Exe", L"C:\\Windows", L"", NULL, SW_SHOWNORMAL, L"C:\\Windows\\NotePad.Exe", 0);
И, в принципе, приведенный код работает замечательно.
НО! Если под win 7 выставить уровень UAC на 3-ку (Пуск -> клик по аватарке пользователя -> Изменение параметров контроля учетных записей -> выставить ползунок на рекомендуемый 3й уровень), то ярлык перестанет создаваться, хотя под отладчиком код полностью отрабатывает.

Проблему можно решить, наделив мою программу администраторскими правами. Но, по моему заданию, делать этого нельзя. Я видел другие программы которые и без администраторских прав как-то ухитряются создавать ярлыки на рабочем столе. Так как же они это делают?
CantStop0708 вне форума Ответить с цитированием
Старый 08.01.2013, 16:27   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

А если не общий десктоп, а текущего юзера?
CSIDL_DESKTOPDIRECTORY
EUGY вне форума Ответить с цитированием
Старый 08.01.2013, 16:41   #3
CantStop0708
 
Регистрация: 08.01.2013
Сообщений: 3
Смех

Цитата:
Сообщение от EUGY Посмотреть сообщение
А если не общий десктоп, а текущего юзера?
CSIDL_DESKTOPDIRECTORY
Благодарю, дружище! Ты меня спас
CantStop0708 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На рабочем столе нельзя правой кнопкой мыши создать новый файл тхт Kapitann Операционные системы общие вопросы 10 09.08.2010 15:49
Программно перетащить ярлык на рабочем столе Windows Обледеневший Общие вопросы C/C++ 9 16.09.2009 18:51
кнопка на рабочем столе guffer Общие вопросы Delphi 3 08.07.2009 12:15
Создать иконку на рабочем столе Михаил Юрьевич Win Api 6 15.04.2009 12:55
Создать окно на рабочем столе AidarBik Win Api 19 09.02.2008 17:47