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


Автор: Malloc 15.11.2006, 18:29
Хочу переделать http://forum.vingrad.ru/topic-66154/unread-1/hl/access%2Cand%2Cthe%2Cand%2Ctwo%2Cand%2Cinterfaces%2Cand%2Cthe%2Cand%2Cobject/index.html для вытаскивания информации о ярлыке, но не знаю, какие заголовочные файлы включить.

В Delphi включаются следующие модули:
Код

  uses    
     ShlObj,    
     ComObj,    
     ActiveX,    
     CommCtrl; 


Какие мне нужно взять заголовочные файлы? Функцию я написал в отдельном от окна модуле. При компиляции пишет, что не знает таких типов и констант, как IShellLink, IPersistFile, CreateComObject, CLSID_ShellLink, SLGP_UNCPRIORITY. 

Думаю, что надо включить ComObj.hpp, ActiveX.hpp, CommCtrl.hpp, но все равно есть ошибки.

Автор: Partizan 15.11.2006, 18:59
а shlobj.hpp не подключал?

Автор: Malloc 15.11.2006, 19:15
Подключил, все равно не находит такие типы. 

Поискал, где IShellLink определен, нашел shobjidl.h. Но при подключении он, по-видимому, конфликтует с vcl.h. Пишет:

[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
[C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'

При отдельной компиляции модуля возникает всего одна ошибка: 

[C++ Error] myclasses.cpp(13): E2451 Undefined symbol 'CLSID_ShellLink'.   

В данном модуле я не использую vcl.h, но когда я его прикрепляю к форме, появляются ошибки выше. Может, нужно вместо shobjidl.h нужно взять какой-то другой файл? 

Автор: SenkraD 15.11.2006, 23:47
либо пишы эту функцию в другом файле, либо в самом верху напиши такое
#define NO_WIN32_LEAN_AND_MEAN

Автор: Partizan 16.11.2006, 04:22
Цитата(Malloc @ 15.11.2006,  19:15)
Подключил, все равно не находит такие типы. 

Поискал, где IShellLink определен, нашел shobjidl.h. Но при подключении он, по-видимому, конфликтует с vcl.h. Пишет:

[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
[C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'

При отдельной компиляции модуля возникает всего одна ошибка: 

[C++ Error] myclasses.cpp(13): E2451 Undefined symbol 'CLSID_ShellLink'.   

В данном модуле я не использую vcl.h, но когда я его прикрепляю к форме, появляются ошибки выше. Может, нужно вместо shobjidl.h нужно взять какой-то другой файл?

про избавление от multiple declaration была тема...я помню точно... фпоиск...

Автор: dumb 16.11.2006, 06:38
Partizan, над твоим постом рецепт.

Автор: Malloc 16.11.2006, 08:03
Спасибо, помогло.  

Автор: Malloc 16.11.2006, 22:45
Теперь выдает исключение. Фрагмент кода

Код

var  
  ShellLink: IShellLink;  
  PersistFile: IPersistFile;  
  AnObj: IUnknown;  
begin  
  // access to the two interfaces of the object  
  AnObj       := CreateComObject(CLSID_ShellLink);  
  ShellLink   := AnObj as IShellLink;  
  PersistFile := AnObj as IPersistFile;  

  // Opens the specified file and initializes an object from the file contents.  
  PersistFile.Load(PWChar(WideString(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile)), 0);  


я переделал так:

Код

  IShellLink    *ShellLink;
  IPersistFile  *PersistFile;
  IUnknown      *AnObj = CreateComObject(CLSID_ShellLink);

  // access to the two interfaces of the object
  ShellLink   = (IShellLink*)  AnObj;
  PersistFile = (IPersistFile*)AnObj;


  // Opens the specified file and initializes an object from the file contents.

  PersistFile->Load(WideString(lpShellLinkInfoStruct->FullPathAndNameOfLinkFile).c_bstr(), 0);


Появляется исключительная ситуация в последней строчке (Load...). Может быть, я типы как-то неправильно перевел (из  IUnknown в IPersistFile)?

Автор: SenkraD 16.11.2006, 23:53
Ну вот тебе пример простенькой програмки:
вот функция для получения инфы о ярлыке
Код

#include <shlobj.h>

AnsiString InfLink(AnsiString Path)
{
 AnsiString str;
 IShellLink *Link;
 char S[255];
 _WIN32_FIND_DATA pfd;
 DWord fFlags;
 Word Hotkey;
 int ShowCmd;
 IPersistFile *ppf;

 CoInitialize(NULL);
 CoCreateInstance(CLSID_ShellLink, NULL,
           CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&Link);
 Link->QueryInterface(IID_IPersistFile, (void**)&ppf);



 if (ppf->Load(WideString(Path), true)== S_OK)
 {
   str=str + ("Ярлык - " + Path) + "\n";
   Link->GetPath(S, 256, &pfd, fFlags);
   str=str + "Связан с объектом - " + AnsiString(S)  + "\n";
   Link->GetDescription(S, 256);
   str=str + "Описание - " +AnsiString (S) + "\n";
   Link->GetWorkingDirectory(S, 256);
   str=str + "Рабочий каталог - " + AnsiString(S) + "\n";
   Link->GetArguments(S, 256);
   if (S != "")
      str=str +"Аргументы отсутствуют" + "\n";
      else str = str + "Аргументы - " +  AnsiString (S) + "\n";
   Link->GetHotkey(&Hotkey);
   if (Hotkey == 0)
      str=str + "Горячие клавиши не назначены" + "\n";
      else str = str + "Горячие клавиши " + AnsiString(Hotkey) + "\n";
   Link->GetShowCmd(&ShowCmd);
   switch( ShowCmd)
    {
     case SW_SHOWNORMAL: str=str + "Обычный размер окна";
          break;
     case SW_MAXIMIZE: str=str + "Окно развертывается на весь экран";
          break;
     case SW_SHOWMINNOACTIVE: str=str + "Окно свертывается в значок";
    }
 }
 CoUninitialize();
 return str;
}

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