C++ windows读取文件版本信息

寻找了许久,找到了这个接口,感谢大佬做出的贡献。 

char*   szFileName   =   "C:\\windows\\system32\\cmd.exe"; 
	DWORD   dwSize   =   GetFileVersionInfoSize(szFileName,NULL); 
	LPVOID   pBlock   =   malloc(dwSize); 
	GetFileVersionInfo(szFileName,0,dwSize,pBlock); 
	
	char*   pVerValue   =   NULL; 
	UINT   nSize   =   0; 
	VerQueryValue(pBlock,TEXT( "\\VarFileInfo\\Translation"), 
		(LPVOID*)&pVerValue,&nSize); 
	
	CString   strSubBlock,strTranslation,strTemp; 
	
	strTemp.Format( "000%x",*((unsigned   short   int   *)pVerValue)); 
	strTranslation   =   strTemp.Right(4); 
	strTemp.Format( "000%x",*((unsigned   short   int   *)&pVerValue[2])); 
	strTranslation   +=   strTemp.Right(4); 
	//080404b0为中文,040904E4为英文 
	
	MessageBox(strTranslation);
 
	//文件描述 
	strSubBlock.Format("\\StringFileInfo\\%s\\FileDescription",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format( "文件描述:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
	
	//内部名称 
	strSubBlock.Format("\\StringFileInfo\\%s\\InternalName",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format( "内部名称:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
	
	//合法版权 
	strSubBlock.Format("\\StringFileInfo\\%s\\LegalTradeMarks",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format( "合法版权:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
	
	//原始文件名 
	strSubBlock.Format("\\StringFileInfo\\%s\\OriginalFileName",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format( "原始文件名:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
	
	//产品名称 
	strSubBlock.Format("\\StringFileInfo\\%s\\ProductName",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format("产品名称:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
	
	//产品版本 
	strSubBlock.Format("\\StringFileInfo\\%s\\ProductVersion",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format("产品版本:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
	
	//版权
	strSubBlock.Format("\\StringFileInfo\\%s\\LegalCopyright",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format("版权:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
 
	//公司名
	strSubBlock.Format("\\StringFileInfo\\%s\\CompanyName",strTranslation); 
	VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize); 
	strSubBlock.ReleaseBuffer(); 
	strTemp.Format("公司名:   %s ",pVerValue); 
	AfxMessageBox(strTemp); 
 
    free(pBlock);

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Windows C中实现大文件的读写封装可以通过以下步骤来完成。 首先,需要使用Windows提供的API函数来操作文件。其中比较常用的函数有CreateFile、ReadFile和WriteFile等。CreateFile函数用于打开文件并返回一个文件句柄,可根据需要设置打开模式、访问权限等。ReadFile函数用于从文件读取数据,可以指定要读取的字节数。WriteFile函数用于向文件中写入数据,同样可以指定要写入的字节数。 其次,可以封装一个读取文件的函数。在该函数中,先通过CreateFile函数打开需要读取的大文件,并获取文件句柄。然后通过循环调用ReadFile函数读取文件内容,直到读取完整个文件。在读取过程中,可以使用一个缓冲区来存储每次读取的数据,避免频繁的文件IO操作。最后,关闭文件句柄,并释放相关资源。 再次,可以封装一个写入大文件的函数。在该函数中,先通过CreateFile函数创建要写入的大文件,并获取文件句柄。然后通过循环调用WriteFile函数将数据写入文件,直到完成全部数据的写入。同样,可以使用一个缓冲区来存储每次要写入的数据,减少文件IO操作次数。最后,关闭文件句柄,并释放相关资源。 此外,为了提高大文件读写的效率,还可以采用多线程或异步IO的方式来并行读写大文件。通过将文件分割成多个块,每个块由独立的线程或IO操作来读写,可以同时进行多个读写操作,加快文件读写速度。 综上所述,通过使用Windows提供的API函数,结合封装的读写函数以及多线程或异步IO的方式来实现大文件的读写封装,可以提高文件IO效率,满足对大文件处理的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值