一个.exe文件通过注册表获取另一个.exe最新的版本来打开应用程序
2017-07-18 00:09
495 查看
本次实现的功能:
通过工程项目launcher编译生成的launcher.exe,通过访问注册表的方式,打开编译好了的Viewer.exe(一个看图软件)。
主要涉及到以下几个模块的实现:
1、通过一个*.exe文件打开另一个*.exe文件
2、访问注册表
3、获取目录
具体操作过程如下:
1、访问注册表,获取我们需要的版本信息。这里我的版本信息存在HEY_CURRENT_USER—>1234Picture—>version中,version里存的版本信息与应用程序所在文件夹同名。访问注册表操作如下:
(1)HKEY hKey;
//声明句柄
(2)调用RegOpenKeyEx(HEKEY_CURRENT_USER,_T("1234Picture"),0,KEY_QUERY_VALUE,&hKey);
打开注册表的HEY_CURRENT_USER(主键)—>1234Picture(从键)键。
返回值为ERROR_SUCCSSES,键打开成功,否则失败。
(3)调用RegQueryValueEx(hKey,_T("version"),NULL, NULL,(LPBYTE)szProductType,&dwBufLen);读取键
返回值为ERROR_SUCCSSES,键读取成功,否则失败。
(4)调用RegCloseKey(hKey);关闭键
注册表访问结束,此时从注册表读取到的数据已经会存储在szProductType变量中了。
2、获取Viewer.exe的绝对路径
前提条件:默认launcher文件夹与各版本Viewer文件夹在同一级目录中
(1)获取launcher的当前目录。
LPTSTR lpStr = new TCHAR[MAX_PATH];
GetCurrentDirectory(MAX_PATH,lpStr);
lpStr指针变量指向了当前目录的存储空间
(2)返回到launcher的上一级目录
(_tcsrchr(lpStr, _T('\\')))[1] = 0; //此命令是将最后一个\之后连同它本身全部删除
(3)获得Viewer.exe所在目录,即是将launcher的上一级目录连接上注册表获得的字符串
_tcscat(lpStr, szProductType);
(4)Viewer.exe所在目录,后面加上Viewer.exe,获得访问文件的路径
3、在launcher运行时打开Viewer.exe
char ansi[MY_BUFSIZE];
// WideCharToMultiByte消除LPTSTR—>LPCSTR的错误
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, ansi, sizeof(ansi), NULL, NULL);
WinExec(ansi, SW_SHOW);
下面附上详细的代码:
// launcher.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <WinUser.h>
using namespace std;
int main()
{
#define MY_BUFSIZE 132
HKEY hKey;
TCHAR szProductType[MY_BUFSIZE];
memset(szProductType, 0, sizeof(szProductType));
DWORD dwBufLen = MY_BUFSIZE;
LONG ret = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("1234Picture"), 0,
KEY_QUERY_VALUE, &hKey);
if (ret != ERROR_SUCCESS)
{
wcout << "错误!\n";
return FALSE;
}
ret = RegQueryValueEx(hKey,
_T("version"),
NULL, NULL,
(LPBYTE)szProductType,
&dwBufLen);
if (ret != ERROR_SUCCESS)
{
wcout << "错误!\n";
return FALSE;
}
RegCloseKey(hKey);
//获取当前路径
LPTSTR lpStr = new TCHAR[MAX_PATH];
GetCurrentDirectory(MAX_PATH,lpStr);
//获取上一级目录
(_tcsrchr(lpStr, _T('\\')))[1] = 0;
// 已知各版本和launcher在同一级目录下
_tcscat(lpStr, szProductType);
// 得到最新版本的绝对路径
_tcscat(lpStr, _T("\\Viewer.exe"));
char ansi[MY_BUFSIZE];
// WideCharToMultiByte消除LPTSTR—>LPCSTR的错误
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, ansi, sizeof(ansi), NULL, NULL);
WinExec(ansi, SW_SHOW);
return 0;
}
这次还有一个最大的收获是了解了LPSTR、LPCSTR、LPTSTR、LPCTSTR、CString、TCHAR等数据类型的基本含义以及相互之间的转换
LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针,而LPWSTR是一个
指向以NULL结尾的64位双字节字符数组指针。LPSTR就是char *,
LPSTR: 32bit指针 指向一个字符串,每个字符占1字节
LPCSTR: 32-bit指针 指向一个常字符串,每个字符占1字节
LPTSTR: 32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
LPCTSTR: 32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
通过工程项目launcher编译生成的launcher.exe,通过访问注册表的方式,打开编译好了的Viewer.exe(一个看图软件)。
主要涉及到以下几个模块的实现:
1、通过一个*.exe文件打开另一个*.exe文件
2、访问注册表
3、获取目录
具体操作过程如下:
1、访问注册表,获取我们需要的版本信息。这里我的版本信息存在HEY_CURRENT_USER—>1234Picture—>version中,version里存的版本信息与应用程序所在文件夹同名。访问注册表操作如下:
(1)HKEY hKey;
//声明句柄
(2)调用RegOpenKeyEx(HEKEY_CURRENT_USER,_T("1234Picture"),0,KEY_QUERY_VALUE,&hKey);
打开注册表的HEY_CURRENT_USER(主键)—>1234Picture(从键)键。
返回值为ERROR_SUCCSSES,键打开成功,否则失败。
(3)调用RegQueryValueEx(hKey,_T("version"),NULL, NULL,(LPBYTE)szProductType,&dwBufLen);读取键
返回值为ERROR_SUCCSSES,键读取成功,否则失败。
(4)调用RegCloseKey(hKey);关闭键
注册表访问结束,此时从注册表读取到的数据已经会存储在szProductType变量中了。
2、获取Viewer.exe的绝对路径
前提条件:默认launcher文件夹与各版本Viewer文件夹在同一级目录中
(1)获取launcher的当前目录。
LPTSTR lpStr = new TCHAR[MAX_PATH];
GetCurrentDirectory(MAX_PATH,lpStr);
lpStr指针变量指向了当前目录的存储空间
(2)返回到launcher的上一级目录
(_tcsrchr(lpStr, _T('\\')))[1] = 0; //此命令是将最后一个\之后连同它本身全部删除
(3)获得Viewer.exe所在目录,即是将launcher的上一级目录连接上注册表获得的字符串
_tcscat(lpStr, szProductType);
(4)Viewer.exe所在目录,后面加上Viewer.exe,获得访问文件的路径
3、在launcher运行时打开Viewer.exe
char ansi[MY_BUFSIZE];
// WideCharToMultiByte消除LPTSTR—>LPCSTR的错误
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, ansi, sizeof(ansi), NULL, NULL);
WinExec(ansi, SW_SHOW);
下面附上详细的代码:
// launcher.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <WinUser.h>
using namespace std;
int main()
{
#define MY_BUFSIZE 132
HKEY hKey;
TCHAR szProductType[MY_BUFSIZE];
memset(szProductType, 0, sizeof(szProductType));
DWORD dwBufLen = MY_BUFSIZE;
LONG ret = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("1234Picture"), 0,
KEY_QUERY_VALUE, &hKey);
if (ret != ERROR_SUCCESS)
{
wcout << "错误!\n";
return FALSE;
}
ret = RegQueryValueEx(hKey,
_T("version"),
NULL, NULL,
(LPBYTE)szProductType,
&dwBufLen);
if (ret != ERROR_SUCCESS)
{
wcout << "错误!\n";
return FALSE;
}
RegCloseKey(hKey);
//获取当前路径
LPTSTR lpStr = new TCHAR[MAX_PATH];
GetCurrentDirectory(MAX_PATH,lpStr);
//获取上一级目录
(_tcsrchr(lpStr, _T('\\')))[1] = 0;
// 已知各版本和launcher在同一级目录下
_tcscat(lpStr, szProductType);
// 得到最新版本的绝对路径
_tcscat(lpStr, _T("\\Viewer.exe"));
char ansi[MY_BUFSIZE];
// WideCharToMultiByte消除LPTSTR—>LPCSTR的错误
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, ansi, sizeof(ansi), NULL, NULL);
WinExec(ansi, SW_SHOW);
return 0;
}
这次还有一个最大的收获是了解了LPSTR、LPCSTR、LPTSTR、LPCTSTR、CString、TCHAR等数据类型的基本含义以及相互之间的转换
LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针,而LPWSTR是一个
指向以NULL结尾的64位双字节字符数组指针。LPSTR就是char *,
LPSTR: 32bit指针 指向一个字符串,每个字符占1字节
LPCSTR: 32-bit指针 指向一个常字符串,每个字符占1字节
LPTSTR: 32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
LPCTSTR: 32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
相关文章推荐
- 通过包名打开另外一个应用程序和获取手机中已安装apk文件信息(PackageInfo、ResolveIn ...
- 通过包名打开另外一个应用程序和获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)
- 通过包名打开另外一个应用程序和获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)
- 通过包名打开另外一个应用程序和获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)
- 通过浏览器的超链接打开本地一个exe文件(即可以传参数)
- git获取一个版本相对于另一个版本新增,修改,删除的文件
- 通过谷歌浏览器的超链接打开本地一个exe文件
- 注册表获取exe位置+ Process类启动exe+参数让exe打开指定文件
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
- 在一个应用程序里打开另一个应用程序(通过包名)
- 练习 2017-08-22 通过控制台,获取类名,字段名称,字段类型,根据一个模板文件,自动创建这个类文件,并且为字段提供setter和getter方法
- 使用“devenv.exe /edit ”命令在一个已经存在的vs实例里打开文件
- 关于MMC不能打开文件C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQL Server Enterprise Manager.MSC可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版本创建。也可能你没有访问此文件的足够权限
- Android 编程日记 如何通过包名打开一个应用程序
- 用minifilter做程序限制的时候,打开.exe文件 会跟着打开一个.exe.config文件
- 编写一个基于对话框的应用程序可以用来打开及显示文本文件设置所显示的文本的字体颜色。
- android获取一个用于打开各种文件的intent
- 一个进程对一个文件加写锁后,另一个进程对相同的文件仍可以以读的模式打开,但是再次加写锁失败。
- 在VS2010中设计一个程序中打开另一个应用程序的实例
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结