VC++调用winrar

来源:互联网 发布:js转义html的特殊字符 编辑:程序博客网 时间:2024/06/06 09:55

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

#include <iostream.h>#include <windows.h>//有的主机上的注册表键值不全,必须进行对多个键的分析char* value1="InstallLocation";char* value2="UninstallString";char* value3="DisplayIcon";//保存winrar的安装路径char winrarInstallPath[260]={0};//检测是否安装winrarbool 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;elsecout<<"没有安装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;}

原创粉丝点击