VC++调用winrar

1.首先判断是否安装winrar,读注册表

#include <iostream.h>
#include <windows.h>

//有的主机上的注册表键值不全,必须进行对多个键的分析
char* value1="InstallLocation";
char* value2="UninstallString";
char* value3="DisplayIcon";
//保存winrar的安装路径
char winrarInstallPath[260]={0};
//检测是否安装winrar
bool isInstallWinrar()
{
	HKEY hSubKey=NULL;
	long result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\WinRAR archiver",0,KEY_READ,&hSubKey);
	if(result!=ERROR_SUCCESS)
		return false;
	
	DWORD size=sizeof(winrarInstallPath);
	DWORD type=REG_SZ;
	//读取第一个优先的属性值
	result=RegQueryValueEx(hSubKey,value1,NULL,&type,(unsigned char*)winrarInstallPath,&size);
	//第一个属性读取不到
	if(result!=ERROR_SUCCESS)
	{		
		//读取第二个属性
		result=RegQueryValueEx(hSubKey,value2,NULL,&type,(unsigned char*)winrarInstallPath,&size);
		if(result!=ERROR_SUCCESS)
		{
			//第二个属性也读取不到,开始读取第三个属性
			result=RegQueryValueEx(hSubKey,value3,NULL,&type,(unsigned char*)winrarInstallPath,&size);		
		}
		//通过第二或第三属性读取到
		if(result==ERROR_SUCCESS)
		{
			int len=strlen(winrarInstallPath);
			while (winrarInstallPath[--len]!='\\')
			{
				winrarInstallPath[len]=0;
			}
		}//还是没有读取到
		else
		{
			RegCloseKey(hSubKey);
			return false;
		}
	}
	
	RegCloseKey(hSubKey);
	strcat(winrarInstallPath,"WinRAR.exe");
	return true;
}

void main()
{
	if(isInstallWinrar())
		cout<<winrarInstallPath<<endl;
	else
		cout<<"没有安装winrar"<<endl;
}


 

2.
//传递需要解压的源文件路径,绝对路径
//解压,本函数为阻塞状态,直到解压进程完成,函数才会返回,所以调用的地方将是阻塞调用
//返回值:winrar退出代码
//srcFloder和destFloder要么都加'\',要么都不加
int deCompress(const char*srcFilePath,const char*srcFloder,const char*destFloder)
{
	//去除后缀,vs2010.iso解压后必定存在于vs2010文件夹内,
	//尤其需要注意的是解压的目的文件夹必须加'\'
	string dest=srcFilePath;
	int pos=dest.find_last_of('.');
	dest.replace(pos,dest.length()-pos,"");
	dest+="\\";
	dest.replace(0,strlen(srcFloder),destFloder);

	//x解压  -ibck后台执行 -o+如存在,则覆盖 -inul不弹出错误提示
	string strCmd=string(winrarInstallPath)+" x -ibck -o+ -inul "+srcFilePath+" "+dest;

	STARTUPINFO si={sizeof(si)};

	//本来想通过下面两句使winrar后台,即隐藏界面,但实践发现,只对命令行解压工具rar.exe有效,
	//但是rar.exe又只能解压rar格式的,所以才使用 -ibck,但也没有真正隐藏,只是缩小到了系统托盘区域
//	si.dwFlags!=STARTF_USESHOWWINDOW;
//	si.wShowWindow=SW_HIDE;
	PROCESS_INFORMATION pi;


	BOOL bRet=CreateProcess(NULL,(char*)strCmd.c_str(),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
	DWORD dwExit=-1;
	if(bRet)
	{
		//这个地方将导致该函数为阻塞状态
		WaitForSingleObject(pi.hProcess,INFINITE);		
		::GetExitCodeProcess(pi.hProcess,&dwExit);
		CloseHandle(pi.hThread);
		CloseHandle(pi.hProcess);
	}
	return dwExit;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值