You are on page 1of 5

Міністерство освіти і науки України

Харківський національний університет радіоелектроніки

Кафедра Інформаційних управляючих систем


Дисципліна: «Операційні системи та системне програмування»

ПРАКТИЧНА РОБОТА № 4

«ПРОГРАМУВАННЯ ВЛАСТИВОСТЕЙ ОКРЕМИХ ВИДІВ


РЕСУРСІВ WINDOWS»

Виконали: Перевірила: асист. каф. ІУС


Кальницька Анжеліка Юріївна
студенти групи ІТУ-21-3
Сібільов Владислав Оцінка ____________________
Олександрович, «____»___________________2022р
Гнідь Микола
Олександрович,
Варава Мар'я
Сергіївна,
Лементова Євгенія
Олегівна,
Пожар Богдан
Миколайович

Харків 2022
Мета роботи: Познайомитися з видами деяких ресурсів Windows та
основними прийомами роботи з системними функціями Win API на
прикладі складання та налагодження програми маніпулювання цими
ресурсами.

Варіант № 5

Створити програму, яка:


Змінює стандартні розміри ярлика будь-якої програми на робочому столі.

Реалізовувати поставлене завдання будемо використовуючи можливості


мови програмування C++.

Код програми:

#include <ShlObj.h>
#include <atlcomcli.h>
#include <system_error>
#include <iostream>
#include <string>
using namespace std;
// Throw a system_error if the HRESULT indicates failure.
template< typename T >
void Throw_If_Failed(HRESULT hr, T&& msg)
{
if (FAILED(hr))
throw system_error{ hr, system_category(), forward<T>(msg) };
}
// RAII wrapper to initialize/uninitialize COM
struct CComInit
{
HRESULT hr = ::CoInitialize(nullptr);
CComInit() { Throw_If_Failed(hr, "CoInitialize failed"); }
~CComInit() { ::CoUninitialize(); }
};
// Query an interface from the desktop shell view.
void Find_Desktop_Folder_View(REFIID riid, void** ppv, string const&
interface_Name)
{
CComPtr<IShellWindows> spShellWindows;
Throw_If_Failed(
spShellWindows.CoCreateInstance(CLSID_ShellWindows),
"Failed to create IShellWindows instance");
CComVariant vtLoc(CSIDL_DESKTOP);
CComVariant vtEmpty;
long lhwnd;
CComPtr<IDispatch> spdisp;
Throw_If_Failed(
spShellWindows->FindWindowSW(
&vtLoc, &vtEmpty, SWC_DESKTOP, &lhwnd,
SWFO_NEEDDISPATCH, &spdisp),
"Failed to find desktop window");
CComQIPtr<IServiceProvider> spProv(spdisp);
if (!spProv)
Throw_If_Failed(E_NOINTERFACE, "Failed to get
IServiceProvider interface for desktop");
CComPtr<IShellBrowser> spBrowser;
Throw_If_Failed(
spProv->QueryService(SID_STopLevelBrowser,
IID_PPV_ARGS(&spBrowser)),
"Failed to get IShellBrowser for desktop");
CComPtr<IShellView> spView;
Throw_If_Failed(
spBrowser->QueryActiveShellView(&spView),
"Failed to query IShellView for desktop");
Throw_If_Failed(
spView->QueryInterface(riid, ppv),
"Could not query desktop IShellView for interface " +
interface_Name);
}
int main(){
try{
CComInit coInit;
CComPtr<IFolderView2> spView;
Find_Desktop_Folder_View(IID_PPV_ARGS(&spView),
"IFolderView2");
FOLDERVIEWMODE view_Mode = FVM_AUTO;
int icon_Size = 0;
Throw_If_Failed(
spView->GetViewModeAndIconSize(&view_Mode,
&icon_Size),
"Get_View_Mode_And_Icon_Size failed");
cout << "Current view mode: " << view_Mode << ", icon size: "
<< icon_Size << endl;
Throw_If_Failed(
spView->SetViewModeAndIconSize(view_Mode, 16),
"Set_View_Mode_And_Icon_Size failed");
return 0;
}
catch (system_error const& e){
cout << "Error: " << e.what() << ", error code: " << e.code() <<
endl;
return 1;
}
}

Консоль:
Результати роботи програми:

Висновки:

При виконанні цієї практичної роботи було отримано знання про


види деяких ресурсів Windows та основні прийоми роботи з системними
функціями Win API на прикладі складання та налагодження програми
маніпулювання цими ресурсами.

You might also like