DotNet4应用程序打包工具->升级版【三】宿主程序分析+全部源码下载

简介: 索引 DotNet4应用程序打包工具->升级版【三】宿主程序分析+全部源码下载 DotNet4应用程序打包工具->升级版【二】安装工具分析 DotNet4应用程序打包工具(把DotNet4安装程序打包进你的应用程序;WINAPI开发,无dotNet环境也可顺利执行)【一】整体思路   ...

索引

DotNet4应用程序打包工具->升级版【三】宿主程序分析+全部源码下载

DotNet4应用程序打包工具->升级版【二】安装工具分析

DotNet4应用程序打包工具(把DotNet4安装程序打包进你的应用程序;WINAPI开发,无dotNet环境也可顺利执行)【一】整体思路

 

废话少说

入口函数

入口函数是所有逻辑的集合体

int WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nCmdShow)
{
	int result;
	LPCTSTR netName = ".net4.exe";
	LPCTSTR tarName = ".tar.exe";
	result = CheckDotNet4();
	if(result == 0)
	{		
		result = FreeRC(MAKEINTRESOURCE(1012),netName);
		if(result == 0)
		{
			Alert("没有成功释放预装工具~安装失败");
			return 0;
		}
		result = CreateInstallProcess(netName);
		if(result == 0)
		{
			Alert("没有成功启动预装工具进程~安装失败");
			ClearFile(netName);
			return 0;
		}
		//暂时不支持静默安装
		//result = InstallIt();
		result = CheckDotNet4();
		if(result == 0)
		{
			Alert("没有成功安装预装工具~安装失败");
			ClearFile(netName);
			return 0;
		}
	}
	result = FreeRC(MAKEINTRESOURCE(1001),tarName);
	if(result == 0)
	{
		Alert("没有成功释放应用程序~安装失败");
		ClearFile(netName);
		ClearFile(tarName);
		return 0;
	}
	result = CreateInstallProcess(tarName);
	if(result == 0)
	{
		Alert("没有成功启动应用程序进程~安装失败");
	}
	ClearFile(netName);
	ClearFile(tarName);
	return 0;
}
 

 

判断目标环境是否有相关的注册表项

先从资源里提取出注册表项

然后判断

int CheckDotNet4()
{
	HMODULE hInstance = ::GetModuleHandle(NULL);
    HRSRC hResID = ::FindResource(hInstance,MAKEINTRESOURCE(1039),RT_RCDATA); 
    HGLOBAL hRes = ::LoadResource(hInstance,hResID);
    LPVOID pRes = ::LockResource(hRes);
	DWORD dwResSize = ::SizeofResource(hInstance,hResID);
	int length = MAX_PATH + 1;
	if(!dwResSize) 
	{
		return 0;
	}
	length = (int)dwResSize;
	TCHAR  regeditStr[MAX_PATH + 1];
	memcpy(regeditStr,pRes,dwResSize);
	regeditStr[dwResSize] = 0;
	HKEY ck;
	int result = 1;
	if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,regeditStr,0,KEY_ALL_ACCESS,&ck))
	{       
		Alert("您的系统中缺少应用程序执行的环境\n现在开始为您搭建该环境");
		result = 0;
	}
	RegCloseKey(ck);
	return result;
}
 

如果没有相关的注册表项

就要释放出想要预先安装的程序

读取资源

并把资源写入文件

int FreeRC(LPCTSTR resourceID,LPCTSTR resourceName)
{    
    HMODULE hInstance = ::GetModuleHandle(NULL);
	TCHAR  szFilePath[MAX_PATH + 1];
	GetPath(szFilePath,resourceName,hInstance);
    HRSRC hResID = ::FindResource(hInstance,resourceID,RT_RCDATA); 
    HGLOBAL hRes = ::LoadResource(hInstance,hResID);
    LPVOID pRes = ::LockResource(hRes);
    DWORD dwResSize = ::SizeofResource(hInstance,hResID);
	if(!dwResSize)
	{
		return 0;
	}
    HANDLE hResFile = CreateFile(szFilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);    
    DWORD dwWritten = 0;
    WriteFile(hResFile,pRes,dwResSize,&dwWritten,NULL);
    CloseHandle(hResFile);
    if(dwResSize == dwWritten);
	{
		return 1;
	}
	return 0;
}
 

成功释放之后

就执行这个程序

注意WaitForSingleObject的WINAPI

是等待进程退出

//创建进程
int CreateInstallProcess(LPCTSTR resourceName)
{
	STARTUPINFO stinfo;
	ZeroMemory((void*)&stinfo,sizeof(STARTUPINFO));
	PROCESS_INFORMATION ProcessInfo;
	stinfo.cb = sizeof(STARTUPINFO);
	stinfo.dwFlags = STARTF_USESHOWWINDOW;
	stinfo.wShowWindow = SW_SHOW;//SW_SHOW  SW_HIDE
	TCHAR  szFilePath[MAX_PATH + 1];
	GetPath(szFilePath,resourceName);//.dotnet4.exe
	int result = CreateProcess(szFilePath,NULL,NULL,NULL,false,0,NULL,NULL,&stinfo,&ProcessInfo);
	WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
	return result;        
}
 

如果进程没有被成功启动

就会删除释放的预安装程序

int ClearFile(LPCTSTR resourceName)
{
	TCHAR  szFilePath[MAX_PATH + 1];
	GetPath(szFilePath,resourceName);//.dotnet4.exe
	int result = ::DeleteFile(szFilePath);
	return result;
}
 

接着再次检查注册表项

result = CheckDotNet4();

如果仍旧没有相关的注册表项

那么说明预安装程序没有安装成功,退出程序

---------------------

至此,检查工作已经完成

入口函数里剩下的代码

是执行目标程序的工作

不在多做解释

	result = FreeRC(MAKEINTRESOURCE(1001),tarName);
	if(result == 0)
	{
		Alert("没有成功释放应用程序~安装失败");
		ClearFile(netName);
		ClearFile(tarName);
		return 0;
	}
	result = CreateInstallProcess(tarName);
	if(result == 0)
	{
		Alert("没有成功启动应用程序进程~安装失败");
	}
	ClearFile(netName);
	ClearFile(tarName);
 

 

---------------------------

打包工具源码下载:BagDotNet_code.zip

宿主程序源码下载:CheckDotNet_code.zip

--------------------------------------------------------

如果您喜欢我的文章,请您推荐我的文章吧~谢谢~

目录
相关文章
|
数据安全/隐私保护 iOS开发 开发者
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(上)
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)
516 0
|
监控 iOS开发
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(下)
iOS 逆向编程(十八)Reveal 详细安装(以及安装问题解决)(下)
254 0
在Xamarin开发中,UWP环境下无法进入断点调试standard库的问题解决方案
在Xamarin开发中,UWP环境下无法进入断点调试standard库的问题解决方案
101 0
|
JavaScript 前端开发 Linux
Electron入门教程1 —— 编写第一个桌面应用程序
Electron入门教程1 —— 编写第一个桌面应用程序
862 0
Electron入门教程1 —— 编写第一个桌面应用程序
|
图形学 Android开发
Unity使用心得 之 ✨ Unity同一工程打包出多个安卓apk,不相互覆盖按照安装说明
Unity使用心得 之 ✨ Unity同一工程打包出多个安卓apk,不相互覆盖按照安装说明
Unity使用心得 之 ✨ Unity同一工程打包出多个安卓apk,不相互覆盖按照安装说明
|
Web App开发 数据可视化 Unix
Windows环境VS2017编译skia库,亲测成功,借助skui的方法
Windows环境VS2017编译skia库,亲测成功,借助skui的方法
705 0
Windows环境VS2017编译skia库,亲测成功,借助skui的方法
|
IDE 开发工具 C++
Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法
Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法
614 0
Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法
|
API C# C++
C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件       这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了。      原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可。
1091 0