C++检查注册表中.net版本号,自动安装.net安装包,然后再执行C#程序
说实在的我的C++功底太浅,希望达人不要笑话
做这篇文章主要是为了解决斯克迪亚的这个问题
实现自动判定是否有.Net框架,没有就安装.Net框架!
啥也不说了先来代码吧!
代码中注释还算多,如仍有问题请在此文下面的评论中提出
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
int CheckReg()
{
LPSTR regeditStr = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5";//现在能判断是不是3.5,但不确定是不是3.5 SP1
HKEY ck;//注册表的键
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,regeditStr,0,KEY_ALL_ACCESS,&ck))//检查注册表是否存在这个键值
{
RegCloseKey(ck);//关闭注册表
cout<<"他的系统里安装了.net3.5,可以执行你的安装包了"<<endl;
return 1;
}
else
{
cout<<"他的系统里没安装.net3.5,现在开始安装!"<<endl;
return 0;
}
}
int StartExe(LPSTR path)
{
STARTUPINFO stinfo;//当创建新进程时,将使用该结构的有关成员
ZeroMemory((void*)&stinfo, sizeof(STARTUPINFO));//把stinfo置空
PROCESS_INFORMATION ProcessInfo;//进程信息的数据结构
stinfo.cb = sizeof(STARTUPINFO);//包含STARTUPINFO结构中的字节数
stinfo.dwFlags = STARTF_USESHOWWINDOW;//显示窗口
stinfo.wShowWindow = SW_SHOW;//该应用程序的第一个重叠窗口应该如何出现
if(!CreateProcess(path,path,NULL,NULL,false,0,NULL,NULL,&stinfo,&ProcessInfo))
{
//DWORD dwRet = GetLastError();//启动失败,获取异常值
return 0;
}
else
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);//等待安装完成,此方法为阻塞方法!
return 1;
}
}
int StartCheck()
{
LPSTR sNetfile = "C:\\Program Files\\NetMeeting\\conf.exe"; //你的.net安装包的路径
LPSTR sExefile = "C:\\Program Files\\Google\\Google Pinyin 2\\GooglePinyinSettingWizard.exe"; //你的程序的路径
if(CheckReg())
{
StartExe(sExefile);
cout<<"安装完成"<<endl;
}
else
{
StartExe(sNetfile);
StartCheck();
}
return 1;
}
int main(void)
{
StartCheck();
char a;
cin>>a;
return 0;
}