系统相关功能开发(五)-系统工具

1.为程序添加快捷方式

void CSysToolSampleDlg::OnButtonCreatelink()	// 为程序添加快捷方式
{
	if (!SUCCEEDED(CoInitialize(NULL)))			// 初始化COM组件
	{
		WriteLog("初始化Shell失败");			// 初始化失败显示信息
		return;									// 返回
	}
	IShellLink *pisl;							// 定义快捷方式接口变量
	if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (void**)&pisl))) 
	{	// 创建快捷方式实例
		IPersistFile* pIPF;						// 定义文件接口变量
		CString szPath;							// 定义文件名变量
		GetModuleFileName(GetModuleHandle(NULL), szPath.GetBuffer(MAX_PATH), MAX_PATH); // 获取运行路径
		pisl->SetPath(szPath);					// 设置文件接口的路径为当前运行路径
		szPath.ReleaseBuffer();					// 释放路径变量
		if (SUCCEEDED(pisl->QueryInterface(IID_IPersistFile, (void**)&pIPF))) 
		{	// 创建文件实例		
			CString szLinkPath;					// 定义创建的快捷方式的路径			
			SHGetSpecialFolderPath(0, szLinkPath.GetBuffer(MAX_PATH), CSIDL_DESKTOPDIRECTORY, 0);// 获取桌面对应的路径
			szLinkPath.ReleaseBuffer();			// 释放快捷方式路径变量
			szLinkPath += szPath.Mid(szPath.ReverseFind('\\'));	// 设置快捷方式的文件名
			szLinkPath += ".lnk";								// 设置快捷方式的扩展名
			WCHAR wpath[MAX_PATH] = { 0 };						// 定义Unicode字符串
			MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szLinkPath, -1, wpath, MAX_PATH);	// 将快捷方式的完整文件名转换为Unicode
			pIPF->Save(wpath, FALSE);			// 设置快捷方式对应的文件名
			pIPF->Release();					// 释放文件接口
			WriteLog("创建快捷方式成功,快捷方式路径=%s", szLinkPath);	// 显示创建的快捷方式信息
		}
		else
            WriteLog("创建文件接口IID_IPersistFile失败");		// 显示错误信息			
		pisl->Release();						// 释放文件接口
	} 
	else WriteLog("创建CLSID_ShellLink实例失败");				// 显示错误信息	
	CoUninitialize();							// 释放COM组件工作环境
}



2.显示系统正在运行的程序

void CSysToolSampleDlg::OnButtonGetproclist()	// 显示系统正在运行的程序
{
	HANDLE hPS=NULL;				// 定义进程快照句柄
    PROCESSENTRY32 pe32={0};		// 定义进程结构变量
    hPS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);				// 创建进程快照
    if (hPS == (HANDLE)-1) 
	{
		WriteLog("调用CreateToolhelp32Snapshot函数创建进程快照失败");	// 显示错误信息
		return;						// 返回
	}
    pe32.dwSize = sizeof(PROCESSENTRY32);		// 为进程结构的大小分量赋值
    if (Process32First(hPS, &pe32))				// 检索快照中的第一个进程
    {
        do 
        {									// 显示检索到得进程信息
			WriteLog("\n优先级=%d\t进程ID=%d\t线程数目=%d\t模块名称=%s",pe32.pcPriClassBase, pe32.th32ProcessID, pe32.cntThreads, pe32.szExeFile);     
        } 
        while (Process32Next(hPS, &pe32));		// 检索快照中的下一个进程
    } 
    else
        WriteLog("调用Process32First函数枚举运行程序失败");	// 显示错误信息
    CloseHandle (hPS);				// 关闭进程快照句柄
}



3.如何获取毫秒级时间


void CSysToolSampleDlg::OnButtonGetmillsecond()		// 如何获得毫秒级时间
{	
	DWORD t1 = timeGetTime();						// 获取自系统启动到现在经过的毫秒数
	Sleep(10);										// 程序休眠10毫秒
	DWORD t2 = timeGetTime();						// 获取自系统启动到现在经过的毫秒数
	WriteLog("开始时间=%u", t1);					// 输出开始时间
	WriteLog("结束时间=%u", t2);					// 输出结束时间
	WriteLog("计时器10毫秒持续的时间=%u", (t2- t1));// 输出10毫秒经过的时间间隔
}



4.注册和卸载组件

void CSysToolSampleDlg::OnButtonRegistcom()			// 注册组件
{
	CString szPath= "COMSample.dll";				// 定义组件路径名称
	HINSTANCE hLib=LoadLibrary(szPath);				// 装载组件
	if (hLib == NULL)								// 如果装载失败,
	{
		WriteLog("装载%s组件文件失败!", szPath);	// 输出错误信息
		return;										// 并返回
	} 	
	FARPROC lpEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer")); // 获取DllRegisterServer函数指针
	if (lpEntryPoint != NULL)						// 如果入口函数不为NULL,则
	{	// 调用函数注册组件
		if(FAILED((*lpEntryPoint)()))	WriteLog("调用组件%s的DllRegisterServer函数失败!", szPath);// 输出错误信息
		else WriteLog("注册%s组件成功!", szPath);	// 输出成功信息
	}
	else WriteLog("没有找到组件%s的入口函数DllRegisterServer,无法注册!", szPath);	// 输出错误信息
	FreeLibrary(hLib);								// 释放对组件的引用
}



void CSysToolSampleDlg::OnButtonUnregistcom()		// 卸载组件
{
	CString szPath= "COMSample.dll";				// 定义组件路径名称
	HINSTANCE hLib=LoadLibrary(szPath);				// 装载组件
	if (hLib == NULL)								// 如果装载失败,
	{
		WriteLog("装载%s组件文件失败!", szPath);	// 输出错误信息
		return;										// 并返回
	}	
	FARPROC lpEntryPoint = GetProcAddress(hLib,_T("DllUnregisterServer"));	// 获取DllUnregisterServer函数指针
	if (lpEntryPoint != NULL)						// 如果入口函数不为NULL,则
	{	// 调用函数卸载组件
		if(FAILED((*lpEntryPoint)()))	WriteLog("调用组件%s的DllUnregisterServer失败!", szPath);	// 输出错误信息
		else WriteLog("卸载%s组件成功!", szPath);	// 输出成功信息
	}
	else WriteLog("没有找到组件%s的入口函数DllUnregisterServer,无法卸载!", szPath);					// 输出错误信息
	FreeLibrary(hLib);								// 释放对组件的引用
}



5.清空回收站

void CSysToolSampleDlg::OnButtonClearbin()			// 清空回收站
{
	if( SHEmptyRecycleBin(this->m_hWnd, NULL, NULL) == S_OK)	// 清空回收站
		WriteLog("清空回收站完成");					// 输出成功信息
	else WriteLog("清空回收站失败");				// 输出错误信息
}



6.如何在程序中显示文件属性对话框

void CSysToolSampleDlg::OnButtonShowprodig()		// 在程序中显示文件属性对话框
{	
	CString szPath;									// 定义路径
	GetCurrentDirectory(MAX_PATH, szPath.GetBuffer(MAX_PATH));	// 获取当前运行路径
	szPath.ReleaseBuffer();							// 释放路径变量
	SHELLEXECUTEINFO   seci;						// 定义可执行信息
	ZeroMemory(&seci,sizeof(seci));					// 初始化可行性信息变量
	seci.cbSize = sizeof(SHELLEXECUTEINFO);			// 赋值可执行变量的大小
	seci.hwnd = this->m_hWnd;						// 赋值窗体句柄
	seci.lpParameters = NULL;						// 赋值参数为NULL
	seci.lpDirectory = szPath;						// 赋值文件夹
	seci.nShow = 0;									// 不显示文件	
	seci.hInstApp = 0;								// 赋值应用实例
	szPath += "\\ReadMe.txt";						// 文件名
	seci.lpFile = szPath;							// 赋值文件名	
	seci.lpVerb = "properties";						// 赋值调用版本为属性
	seci.fMask = SEE_MASK_NOCLOSEPROCESS|SEE_MASK_INVOKEIDLIST|SEE_MASK_FLAG_NO_UI;  // 设置选项 
	ShellExecuteEx(&seci);							// 调用文件属性对话框
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值