您的位置:首页 > 编程语言 > C语言/C++

一个.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是否定义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐