如何得到其它程序的文件信息,比如版本号,公司名,内部文件名

ncucf 2006-01-24 11:56:40
我用GetFileVersionInfo总是不成功,代码如下

char info[512];
if(GetFileVersionInfo(_T("c:\\adji.exe"),NULL,512,info))

{

UINT cbTranslate=512;
TCHAR SubBlock[512];
TCHAR lpBuffer[512];
UINT dwBytes=512;
//if(VerQueryValue(info, TEXT("\\StringFileInfo\\040904E4\\CompanyName"), (LPVOID*)&SubBlock, &dwBytes))
VerQueryValue(info,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate);

// Read the file description for each language and code page.
HRESULT hr;
for( int i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
{
hr = StringCchPrintf(SubBlock, 50,
TEXT("\\StringFileInfo\\%04x%04x\\CompanyName"),
(STRSAFE_LPWSTR)lpTranslate[i].wLanguage,
(STRSAFE_LPWSTR)lpTranslate[i].wCodePage);
if (FAILED(hr))
{
// TODO: write error handler.
}

if(VerQueryValue(info,SubBlock , (LPVOID*)&SubBlock, &dwBytes))
MessageBox((LPCTSTR)SubBlock);
}
function::GetMyLastError();
}

按照msdn上的试了n次,都没用!不知道大家怎么获得一个exe文件的信息,比如公司、版本号、内部文件名之类的!
...全文
555 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ncucf 2006-02-05
  • 打赏
  • 举报
回复
up
ncucf 2006-01-24
  • 打赏
  • 举报
回复
把缓冲区设置大一些,的确可以接到信息,不过都是乱码,如:쳌쳌쳌쳌쳌쳌,
而且那个 国家代码页多种多样,添加监视后可以见一下几种:

"\StringFileInfo\080404b0\CompanyName"
"\StringFileInfo\080403a8\CompanyName"
"\StringFileInfo\040904e4\CompanyName"

至于schwarzenegger(找不到服务器)说只是对于有版本资源文件的才可以获取,这个我知道,大部分的软件都含有相关信息的,微软的资源管理器默认就会显示那些,我拿来做试验的都是有版本信息的exe文件!

函数声明或介绍,msdn上都有,我只是不知道问题出在哪,希望大家帮助一起测试测试!
rageliu 2006-01-24
  • 打赏
  • 举报
回复
up

  GetFileVersionInfo函数被用来获取包含在指定文件中的版本信息。其Delphi函数声明如下:



function GetFileVersionInfo(
lptstrFilename: PChar; // 文件名
dwHandle: DWORD; // 忽略
dwLen: DWORD; // 缓冲区大小
lpData: Pointer // 版本信息缓冲区
): BOOL; stdcall;

  参数说明:

  lptstrFilename,一个以NULL结束字符串,它指定了期望从中获取版本详细的文件名。如果文件名不包含完整路径,函数将使用LoadLibrary函数的默认搜索次序进行搜索。在Windows 95/98/Me操作系统中路径名不能超过126个字符。

  dwHandle,这个参数没有使用,将被忽略。

  dwLen,请先调用GetFileVersionInfoSize函数确定文件版本信息的字节数大小。dwLen必须等于或大于这个值。如果lpDate指向的缓冲区空间不够,函数将根据实际大小裁减出文件的版本信息。

  lpData,指向一个用于保存函数调用后返回的文件版本信息的缓冲区。

  如果函数调用成功,它将返回True;否则返回False。可通过GetLastError函数得到扩展的错误信息。

  在调用GetFileVersionInfo函数前必须先调用GetFileVersionFileSize。为了从文件版本信息中获取有用信息,必须使用VerQueryValue函数。

  1.2. GetFileVersionInfoSize函数

  GetFileVersionInfoSize函数被用来判断操作系统是否能够从指定文件中获取版本信息。如果存在版本信息,便返回以字节为单位的这些信息所占用空间的大小。其Delphi函数声明如下:



function GetFileVersionInfoSize(
lptstrFilename: PChar; // 文件名
var lpdwHandle: DWORD // set to zero
): DWORD; stdcall;

  参数说明:

  lptstrFilename,一个以NULL结束字符串,它指明期望从哪个文件中获取版本信息的文件名。

  lpdwHandle,一个指向将被函数设置为0的变量的指针。

  如果函数调用成功,它将返回文件版本信息的字节大小;否则返回0,可通过GetLastError函数得到扩展的错误信息。

  在调用GetFileVersionInfo函数前应先调用GetFileVersionInfoSize函数。GetFileVersionInfoSize函数的返回值确定了GetFileVersionInfo函数所使用的版本信息缓冲区的大小。
schwarzenegger 2006-01-24
  • 打赏
  • 举报
回复
有 VERSIONINFO Resource 的文件才能成功。
你试的文件是没有VERSIONINFO Resource。
You can add version information to any files that can have Microsoft® Windows® resources, such as dynamic-link libraries (DLLs), executable files, or font files. To add the information, create a VERSIONINFO Resource and use the resource compiler to compile the resource.


char info[512]; 《==GetFileVersionInfoSize 代替512。



16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧