md5小工具

/***************************************************************************************
* AUTHOR : L0g1n
* DATE   : 2013-12-23
* MODULE : md5ToClipboard
* 
* MD5计算工具
* 双击运行程序后会自动拷贝文件到系统目录下、添加鼠标右键菜单、原文件自删除。
* 使用方法:
* 在需要计算的文件上右键选择md5--->Clipboard,然后MD5就被存放到剪贴版中了。
* 
* 开发原因:
* 1、由于经常使用MD5计算工具,计算完成后多数操作为复制到文档中,太过麻烦。
* 2、代码积累,该程序中所使用到的技术:自动请求Admin权限、注册表操作、自删除、剪贴板、鼠标右键添加等
* 
* 本程序特点:
* 无色无味无残留无界面
* 
* xp与Win8测试通过。
* 在xp下可能需要安装vs2010的运行库:Microsoft Visual C++ 2010
* 
* 如有问题:请联系:l0g1n@qq.com
****************************************************************************************
* Copyright (C) 2013 L0g1n.
****************************************************************************************/

#include "md5.h"
#include <shlobj.h>
#include <atlconv.h>
#pragma comment(lib, "shell32.lib")

//提升权限
BOOL RunElevated(LPCSTR pszPath)  
{  
	SHELLEXECUTEINFOA shex;  

	memset( &shex, 0, sizeof( shex) );  

	shex.cbSize        = sizeof( SHELLEXECUTEINFOA );  
	shex.fMask        = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;  
	shex.hwnd        = NULL;  
	shex.lpVerb        = ("runas");  
	shex.lpFile        = pszPath;  
	shex.lpDirectory    = NULL;
	shex.nShow        = SW_NORMAL;  
	return ::ShellExecuteExA( &shex ); 
}

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdShow, int nShow)
{
	//获取参数
	LPWSTR *szArgList;
	int argCount;
	szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
	if(argCount == 2)
	{
		USES_CONVERSION;
		char md5[40] = {0};
		strcpy(md5, MD5File(W2A(szArgList[1])));
		for(int i = 0; i < 32; i++)
		{
			md5[i] = toupper(md5[i]);
		}

		//剪贴版操作
		if(OpenClipboard(NULL))
		{
			EmptyClipboard();
			HANDLE hClip = GlobalAlloc(GMEM_MOVEABLE, 40);
			char* pBuf = (char *)GlobalLock(hClip);
			strcpy(pBuf, md5);
			GlobalUnlock(hClip);
			SetClipboardData(CF_TEXT, hClip);
			CloseClipboard();
		}

		LocalFree(szArgList);
	}
	else
	{
		//该部分为第一次运行时的安装
		HKEY hKey;
		HKEY hSubKey;
		char szSource[MAX_PATH] = {0};
		char szDst[MAX_PATH] = {0};

		//文件拷贝
		GetModuleFileNameA(NULL, szSource, MAX_PATH);

		//请求UAC权限
		if(!IsUserAnAdmin())
		{
			RunElevated(szSource);
		}
		else
		{

			SHGetSpecialFolderPathA(NULL,szDst, CSIDL_PROGRAM_FILES, FALSE);
			lstrcatA(szDst, "\\md5ToClipboard.exe");

			if(!CopyFileA(szSource, szDst, FALSE))
			{
				MessageBoxA(NULL,"Copy Failed","Error",MB_OK);
				return -1;
			}
			char data[MAX_PATH] = {0};
			strcpy(data, szDst);
			lstrcatA(data, " %1");

			//注册表部分操作
			if(ERROR_SUCCESS == RegOpenKeyExA(HKEY_CLASSES_ROOT, "*", 0, KEY_SET_VALUE, &hKey))
			{
				if(ERROR_SUCCESS == RegCreateKeyA(hKey, "shell\\md5--->Clipboard\\command", &hSubKey))
				{
					if(ERROR_SUCCESS != RegSetValueExA(hSubKey, NULL, 0, REG_SZ, (BYTE *)data, strlen(data)))
					{
						MessageBoxA(NULL,"Reg Set Failed","Error",MB_ICONERROR);
					}
				}
				else
				{
					MessageBoxA(NULL, "Create Sub Key Failed", "Error", MB_ICONERROR);
				}
			}
			else
			{
				MessageBoxA(NULL, "shell Sub Key is not Exist", "Error", MB_ICONERROR);
			}
			RegCloseKey(hKey);
			RegCloseKey(hSubKey);

			//文件自删除
			char szDel[MAX_PATH] = {0};
			wsprintfA(szDel, "cmd.exe /c ping -n 5 127.0.0.1 && del \"%s\"", szSource);
			WinExec(szDel, SW_HIDE);
		}
	}

	return 0;
}


代码下载地址:

http://download.csdn.net/detail/l0g1n/6760731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值