C++编程实现从注册表中获取程序安装路径并调用exe文件。

最近用c++做利用WINAPI启动应用程序的测试, 一番周折之后,成功解决 利用注册表函数获取程序安装路径的宽字符和WINEXEC方法参数不一致的问题。长话短说,附上代码如下:

#include <iostream>
#include <windows.h>
using namespace std;
#define RTN_ERROR 13
#pragma comment(lib, "advapi32")
int main(void)
{
	#define MY_BUFSIZE 132    // Arbitrary initial value. 
	// Dynamic allocation will be used.
	HKEY hKey;
	TCHAR szProductType[MY_BUFSIZE];
	memset(szProductType,0,sizeof(szProductType));
	DWORD dwBufLen = MY_BUFSIZE;
	LONG lRet;

	// 下面是打开注册表, 只有打开后才能做其他操作 
	lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,  // 要打开的根键 
		TEXT("SOFTWARE\\TENCENT\\QQ2009"), // 要打开的子子键 
		0,        // 这个一定要为0 
		KEY_QUERY_VALUE,  //  指定打开方式,此为读 
		&hKey);    // 用来返回句柄 

	if(lRet != ERROR_SUCCESS)   // 判断是否打开成功 
		return 1;
	//下面开始查询 
	lRet = RegQueryValueEx(hKey,  // 打开注册表时返回的句柄 
		TEXT("Install"),  //要查询的名称,qq安装目录记录在这个保存 
		NULL,   // 一定为NULL或者0 
		NULL,   
		(LPBYTE)szProductType, // 我们要的东西放在这里 
		&dwBufLen);
	if(lRet != ERROR_SUCCESS)  // 判断是否查询成功 
		return 1;
	RegCloseKey(hKey);
	char ansi[MY_BUFSIZE]; 
	WideCharToMultiByte(CP_ACP, 0, szProductType, -1, ansi, sizeof(ansi), NULL, NULL); 
	strcat(ansi,"\\Bin\\QQ.EXE");
	cout<<ansi;
	WinExec(ansi,SW_SHOW); 
}
在这里,szProductType是TCHAR类型,也就是宽字符,而winexec的第一个参数要求是char*,所以就出问题了。使用WideCharToMultiByte方法可以完美解决这个问题。运行程序后,就会出现qq的启动界面。


你可能感兴趣的:(C++,C++,注册表,安装路径)