Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как взять название продукта


Автор: NikSer 7.5.2006, 17:37
Зравствуйте!

Как взять название продукта из свойства exe-шки и хранить где-нибудь в строке?

Заранее благодарен! 

Автор: chwind 10.5.2006, 14:05
Здесь же или на http://forum.sources.ru недавно было:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    DWORD h;
    DWORD Size=GetFileVersionInfoSize(Application->ExeName.c_str(), &h);
    if(Size==0) return;
    char *buf;
    buf=(char*)GlobalAlloc(GMEM_FIXED, Size);
    if(GetFileVersionInfo(Application->ExeName.c_str(),
                          h,
                          Size,
                          buf)!=0)
    {
       char *ValueBuf;
       UINT Len;
       VerQueryValue(buf, "\\VarFileInfo\\Translation", &(void*)ValueBuf, &Len);
       if(Len>=4)
       {
          AnsiString CharSet=IntToHex((int)MAKELONG(*(int*)(ValueBuf+2), *(int*)ValueBuf), 8);

          if(VerQueryValue(buf,
                        AnsiString("\\StringFileInfo\\"+CharSet+"\\InternalName").c_str(),
                        &(void*)ValueBuf,
                        &Len)!=0)
                        Memo1->Lines->Add(ValueBuf);
                        //AppName->Caption=ValueBuf;

          if(VerQueryValue(buf,
                        AnsiString("\\StringFileInfo\\"+CharSet+"\\ProductName").c_str(),
                        &(void*)ValueBuf,
                        &Len)!=0)
                        Memo1->Lines->Add(ValueBuf);
                        //AppName->Caption=ValueBuf;
          if(VerQueryValue(buf,
                        AnsiString("\\StringFileInfo\\"+CharSet+"\\FileVersion").c_str(),
                        &(void*)ValueBuf,
                        &Len)!=0)
                        Memo1->Lines->Add(ValueBuf);
                        //Version->Caption=ValueBuf;
          if(VerQueryValue(buf,
                        AnsiString("\\StringFileInfo\\"+CharSet+"\\LegalCopyright").c_str(),
                        &(void*)ValueBuf,
                        &Len)!=0)
                        Memo1->Lines->Add(ValueBuf);
                        //Copyright->Caption=ValueBuf;
          if(VerQueryValue(buf,
                        AnsiString("\\StringFileInfo\\"+CharSet+"\\CompanyName").c_str(),
                        &(void*)ValueBuf,
                        &Len)!=0)
                        Memo1->Lines->Add(ValueBuf);
                        //Company->Caption=ValueBuf;

       }
    }
    GlobalFree(buf);
}
//---------------------------------------------------------------------------
 

Автор: NikSer 10.5.2006, 16:52
Спасибо большое за пример!!!

Еще хотел спросить, а можно загрузить название программы примерно таким же приемом, например написанное в Buildere Form1->Caption? Ведь это где-то хранится.

Я в место Application->ExeName.c_str() пишу путь к любому екзе файлу и загружаю название программы! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)