C++ 查找本机安装word的版本号,
来源:互联网 发布:淘宝中信v卡有什么好处 编辑:程序博客网 时间:2024/06/07 23:31
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "Version")
// 从exe中读取产品名称
PTSTR FileVersion(LPTSTR szFile, LPTSTR ProductName, DWORD NameLen)
{
DWORD dwHandle, dwlen;
UINT cbTranslate;
// 得到版本信息
dwlen = GetFileVersionInfoSize(szFile,&dwHandle);
PBYTE pBlock = new BYTE[dwlen];
if(GetFileVersionInfo(szFile,
dwHandle,
dwlen,
pBlock) == FALSE)
{
delete []pBlock;
return NULL;
}
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
// Read the list of languages and code pages
if (VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate) == FALSE)
{
delete []pBlock;
return NULL;
}
TCHAR *SubBlock = new TCHAR[64];
UINT dwBytes;
LPVOID lpBuffer;
// Read the file description for each language and code page.
wsprintf( SubBlock,
TEXT("\\StringFileInfo\\%04x%04x\\ProductName") ,
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
VerQueryValue(pBlock,
SubBlock,
(void **)&lpBuffer,
&dwBytes);
if (dwBytes > NameLen-sizeof(TCHAR))
{
delete []SubBlock;
delete []pBlock;
return NULL;
}
ZeroMemory(ProductName, NameLen);
memcpy(ProductName, lpBuffer, dwBytes);
delete []SubBlock;
delete []pBlock;
return ProductName;
}
// 从注册表取得doc关联程序并调用查询exe名称函数
PTSTR GetWordVersion(LPTSTR ProductName, DWORD NameLen)
{
PTSTR RegPath = new TCHAR[MAX_PATH];
PTSTR DocFtype = new TCHAR[MAX_PATH];
PTSTR WordVersion = NULL;
LONG lpcbValue;
// 得到关联.doc的ftype
HKEY hkey;
if( RegOpenKey(HKEY_CLASSES_ROOT,
TEXT(".doc"),
&hkey) != ERROR_SUCCESS)
{
goto QUERY_ERROR ;
}
ZeroMemory(DocFtype, MAX_PATH*sizeof(TCHAR));
lpcbValue = MAX_PATH*sizeof(TCHAR);
if ( RegQueryValue(hkey, NULL, DocFtype, &lpcbValue) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
goto QUERY_ERROR ;
}
RegCloseKey(hkey);
// 从ftype中得到关联exe所在位置
wsprintf(RegPath, TEXT("%s\\shell\\Open\\command"), DocFtype);
if( RegOpenKey(HKEY_CLASSES_ROOT,
RegPath,
&hkey) != ERROR_SUCCESS)
{
goto QUERY_ERROR ;
}
ZeroMemory(DocFtype, MAX_PATH*sizeof(TCHAR));
lpcbValue = MAX_PATH*sizeof(TCHAR);
if ( RegQueryValue(hkey, NULL, DocFtype, &lpcbValue) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
goto QUERY_ERROR ;
}
RegCloseKey(hkey);
// 取出exe路径
ZeroMemory(RegPath, MAX_PATH*sizeof(TCHAR));
if ( DocFtype[0] == TEXT('\"') )
{
for (int i = 0; i<lpcbValue; i++)
{
if (DocFtype[i+1] == TEXT('\"'))
{
break;
}
RegPath[i] = DocFtype[i+1];
}
}
else
{
for (int i = 0; i<lpcbValue; i++)
{
if (DocFtype[i] == TEXT(' '))
{
break;
}
RegPath[i] = DocFtype[i];
}
}
// 得到exe 产品名称
WordVersion = FileVersion(RegPath, ProductName, NameLen);
QUERY_ERROR:
delete []DocFtype;
delete []RegPath;
return WordVersion;
}
int main(int argc, char* argv[])
{
TCHAR FileName[1024] = {0};
printf("%s\n", GetWordVersion(FileName, 1024));
return 0;
}
#include <stdio.h>
#pragma comment(lib, "Version")
// 从exe中读取产品名称
PTSTR FileVersion(LPTSTR szFile, LPTSTR ProductName, DWORD NameLen)
{
DWORD dwHandle, dwlen;
UINT cbTranslate;
// 得到版本信息
dwlen = GetFileVersionInfoSize(szFile,&dwHandle);
PBYTE pBlock = new BYTE[dwlen];
if(GetFileVersionInfo(szFile,
dwHandle,
dwlen,
pBlock) == FALSE)
{
delete []pBlock;
return NULL;
}
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
// Read the list of languages and code pages
if (VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate) == FALSE)
{
delete []pBlock;
return NULL;
}
TCHAR *SubBlock = new TCHAR[64];
UINT dwBytes;
LPVOID lpBuffer;
// Read the file description for each language and code page.
wsprintf( SubBlock,
TEXT("\\StringFileInfo\\%04x%04x\\ProductName") ,
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
VerQueryValue(pBlock,
SubBlock,
(void **)&lpBuffer,
&dwBytes);
if (dwBytes > NameLen-sizeof(TCHAR))
{
delete []SubBlock;
delete []pBlock;
return NULL;
}
ZeroMemory(ProductName, NameLen);
memcpy(ProductName, lpBuffer, dwBytes);
delete []SubBlock;
delete []pBlock;
return ProductName;
}
// 从注册表取得doc关联程序并调用查询exe名称函数
PTSTR GetWordVersion(LPTSTR ProductName, DWORD NameLen)
{
PTSTR RegPath = new TCHAR[MAX_PATH];
PTSTR DocFtype = new TCHAR[MAX_PATH];
PTSTR WordVersion = NULL;
LONG lpcbValue;
// 得到关联.doc的ftype
HKEY hkey;
if( RegOpenKey(HKEY_CLASSES_ROOT,
TEXT(".doc"),
&hkey) != ERROR_SUCCESS)
{
goto QUERY_ERROR ;
}
ZeroMemory(DocFtype, MAX_PATH*sizeof(TCHAR));
lpcbValue = MAX_PATH*sizeof(TCHAR);
if ( RegQueryValue(hkey, NULL, DocFtype, &lpcbValue) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
goto QUERY_ERROR ;
}
RegCloseKey(hkey);
// 从ftype中得到关联exe所在位置
wsprintf(RegPath, TEXT("%s\\shell\\Open\\command"), DocFtype);
if( RegOpenKey(HKEY_CLASSES_ROOT,
RegPath,
&hkey) != ERROR_SUCCESS)
{
goto QUERY_ERROR ;
}
ZeroMemory(DocFtype, MAX_PATH*sizeof(TCHAR));
lpcbValue = MAX_PATH*sizeof(TCHAR);
if ( RegQueryValue(hkey, NULL, DocFtype, &lpcbValue) != ERROR_SUCCESS)
{
RegCloseKey(hkey);
goto QUERY_ERROR ;
}
RegCloseKey(hkey);
// 取出exe路径
ZeroMemory(RegPath, MAX_PATH*sizeof(TCHAR));
if ( DocFtype[0] == TEXT('\"') )
{
for (int i = 0; i<lpcbValue; i++)
{
if (DocFtype[i+1] == TEXT('\"'))
{
break;
}
RegPath[i] = DocFtype[i+1];
}
}
else
{
for (int i = 0; i<lpcbValue; i++)
{
if (DocFtype[i] == TEXT(' '))
{
break;
}
RegPath[i] = DocFtype[i];
}
}
// 得到exe 产品名称
WordVersion = FileVersion(RegPath, ProductName, NameLen);
QUERY_ERROR:
delete []DocFtype;
delete []RegPath;
return WordVersion;
}
int main(int argc, char* argv[])
{
TCHAR FileName[1024] = {0};
printf("%s\n", GetWordVersion(FileName, 1024));
return 0;
}
0 0
- C++ 查找本机安装word的版本号,
- vb 得到本机网卡的物理地址、操作系统的安装路径及版本号
- 查询本机OpenGL版本号
- 如何通过C的方式在android NDK下面查找本机的mac地址
- Android获取本应用的版本号
- android获取本机号码,版本号,手机型号
- 查看安装的ROS版本号
- shell:查找本目录所有C文件中具有abcdefg字符的.c文件
- Word查找所有的数字
- Word Search 单词的查找
- word的高级查找替换
- Android 中如何获取本app的版本号?
- mtk_设置_关于本机_版本号
- C#/获取本机IP的代码
- Android本地版本号查找
- HBase 查找版本号
- 列举本机安装的解码器(CODEC)
- C#获取本机安装的字体
- app触控的代码
- 上面俩题的小结-派生类访问基类私有成员的方法
- 成为软件工程师最精彩的地方是什么
- 12个非常实用的JavaScript小技巧
- 【数据结构】 栈和队列 YTU 2242: 回文(栈和队列)
- C++ 查找本机安装word的版本号,
- setPadding()无效的原因分析
- 关于quartz cron表达式饭解析验证输出实现部分截图代码
- if else 有时候可以这样写
- getopts命令行参数处理
- 初识Container View Controller
- poj之旅——3616
- 九大排序算法
- 关于前端的思考和感悟