PDA

View Full Version : گرفتن نام كمپاني يك فايل



hoax3r
شنبه 29 تیر 1387, 11:44 صبح
سلام

آيا api‌ اي هست كه مشخصاتي مثل كمپاني سازنده فايل رو بشه بدست آورد
منظورم اطلاعاتي هست كه از طريق properties گرفتن از فايل گرفته ميشه

با تشكر

Nima_NF
شنبه 29 تیر 1387, 15:46 عصر
ابتدا از GetFileVersionInfo و GetFileVersionInfoSize برای گرفتن بافر داده های version استفاده کنید و سپس از VerQueryValue استفاده کنید تا خاصیت مورد نظر خود را دریافت کنید(مثلا CompanyName ).

در MSDN مثال زیر برای گرفتن FileDescription وجود دارد، به همین شکل برای سایر خواص:



// Structure used to store enumerated languages and code pages.

HRESULT hr;

struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;

// Read the list of languages and code pages.

VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate);

// Read the file description for each language and code page.

for( i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
{
hr = StringCchPrintf(SubBlock, 50,
TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
lpTranslate[i].wLanguage,
lpTranslate[i].wCodePage);
if (FAILED(hr))
{
// TODO: write error handler.
}

// Retrieve file description for language and code page "i".
VerQueryValue(pBlock,
SubBlock,
&lpBuffer,

hoax3r
شنبه 29 تیر 1387, 17:05 عصر
ممنون بابت جوابتون، در استفاده از GetFileVersionInfoSize به مشكل برخوردم مسير هر فايلي رو كه بهش ميدم
مقدار صفر برميگردونه در حالي كه بايد مقدار سايز بافر version رو بده

بخشي از كد به اين صورت است:


#include <windows.h>

#define PATH_SIZE 512
...
...
int main()
{
char filePath[PATH_SIZE];
DWORD dwHandle;
...
...
dwLen = GetFileVersionInfoSize(filePath, &dwHandle);

if ( !dwLen )
continue;

...
...
return
}


مقدار filePath هم مسير فايل رو به صورت كامل به تابع ميفرسته ولي مقدار صفر برگردانده ميشود

مثل اين مسير:


C:\\WINDOWS\\system32\\drivers\\acpi.sys


به نظرتون كجاي كار مشكل داره.

با تشكر

Nima_NF
شنبه 29 تیر 1387, 23:51 عصر
برای من درست جواب می دهد، موارد زیر را بررسی کنید:

- اگر خطا برای تابع داده می شود، Version.lib را به لینکر اضافه کنید.

- در صورتی که از کامپایلر های چند سال اخیر استفاده نمی کنید، اگر مسیر را به صورت char می فرستید و پروژه را هم یونیکد کامپایل نمی کنید، از نسخه توابع + A استفاده کنید، تا مسیر اشتباه ارسال نشود.



DWORD h = 0;

DWORD resSize = ::GetFileVersionInfoSizeA (
"C:\\WINDOWS\\system32\\drivers\\acpi.sys", &h);

اگر هم پروژه یونیکد هست (پیش فرض کامپایلرهای اخیر) به شکل زیر و مسیر هم از نوع TCHAR باشد نه char :



//or use --> TCHAR str_file = _T("C//...");

DWORD h = 0;

DWORD resSize = ::GetFileVersionInfoSize(
_T("C:\\WINDOWS\\system32\\drivers\\acpi.sys"), &h);

- بعد از فراخوانی تابع GetLastError را فراخوانی کنید تا دقیق نوع خطا مشخص شود.

مموفق باشید

hoax3r
یک شنبه 30 تیر 1387, 13:46 عصر
با تشکر از شما Nima_NF و وقتی که گزاشتین، مشکلم حل شد

شاد باشید