/***************************************************************************************
* 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;
}
代码下载地址: