我用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文件的信息,比如公司、版本号、内部文件名之类的!
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文件的信息,比如公司、版本号、内部文件名之类的!
你试的文件是没有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。
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函数所使用的版本信息缓冲区的大小。
而且那个 国家代码页多种多样,添加监视后可以见一下几种:"\StringFileInfo\080404b0\CompanyName"
"\StringFileInfo\080403a8\CompanyName"
"\StringFileInfo\040904e4\CompanyName" 至于schwarzenegger(找不到服务器)说只是对于有版本资源文件的才可以获取,这个我知道,大部分的软件都含有相关信息的,微软的资源管理器默认就会显示那些,我拿来做试验的都是有版本信息的exe文件! 函数声明或介绍,msdn上都有,我只是不知道问题出在哪,希望大家帮助一起测试测试!