Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как убрать кавычки в свойствах ярлыка?


Автор: Коп 20.8.2003, 13:33
Есть функция, к-ая создает ярлык в указанном месте диска к указанному объекту. Но вот в чем проблема: если в передаваемом имени объекта стоят пробелы, то это имя в заключается в двойные кавычки. А как же тогда передавать параметры для запускаемой программы (полное имя к-ой передается)? notify.gif
Подскажите, пожалуйста, очень надо!

А вот и сама функция:
Код
#include <shlobj.h>  //Для работы с ярлыками (функция Create_Icon)
#include <dir.h>  //Для функции Is_Dir (char *dir_name)
#include <string.h>
//---------------------------------------------------------------------------

void __fastcall Create_Icon(char *link_fullname, char *prog_name, char *ico4link = NULL, int ico_num = 0, char *work_dir = NULL);
bool __fastcall Is_Dir(char *dir_name);
//---------------------------------------------------------------------------

void __fastcall Create_Icon(char *link_fullname, char *prog_name, char *ico4link, int ico_num, char *work_dir)
{//Функция создает ярлык с зад-ым именем icon_fullname к объекту prog_name с
//рабочим каталогом work_dir (если он не указан явно, то это каталог, в
//котором лежит этот объект), значком из ico4link под номером ico_num
//#include <shlobj.h>
CoInitialize(NULL);
IShellLink *SLink;
HRESULT HRes = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER,
IID_IShellLink, ( LPVOID*)&SLink);
HRes = SLink->SetPath(prog_name);// Путь к запускаемой программе, для которой создаем ярлык

if (ico4link != NULL)//Если ресурс значка указан явно, то устанавливаем его
HRes = SLink->SetIconLocation(ico4link, ico_num);//Устанавливает значок для ярлыка

if (work_dir[0] != NULL) goto dir_set; //Если р. каталог задан, используем его
work_dir = prog_name;
if (!Is_Dir(work_dir))
  {//Если файл НЕ директория,то берем ее рабочую директорию
  work_dir[strlen(work_dir) - strlen(strrchr(work_dir, '\') + 1)] = '<!--POST BOX-->';
  }
dir_set:

HRes = SLink->SetWorkingDirectory(work_dir);// Рабочий каталог для програмы

IPersistFile *PF;
HRes = SLink->QueryInterface(IID_IPersistFile, (LPVOID*)&PF);

wchar_t *w_link_name = (wchar_t *) malloc(MAX_PATH);
MultiByteToWideChar(CP_ACP, 0, link_fullname, -1, w_link_name, MAX_PATH);

HRes = PF->Save(w_link_name, TRUE);
SLink->Release();
CoUninitialize();
w_link_name = NULL;
}
//---------------------------------------------------------------------------

bool __fastcall Is_Dir(char *dir_name)
{//Проверяет, является ли передаваемое имя директорией
//#include <dir.h>
char *cur_dir;
cur_dir = (GetCurrentDir()).c_str();
if (chdir(dir_name)) return false;
chdir(cur_dir);
return true;
}
//---------------------------------------------------------------------------

Автор: kruchinin 20.8.2003, 17:26
Если имя содержит пробелы,то
например
Progr Win.exe

<путь...\>"Progr Win.exe" <параметр 1> <параметр 2>...

Автор: Step 21.8.2003, 08:34
kruchinin, а не в ковычки случайно...

Автор: Коп 21.8.2003, 09:15
Может не очень понятно написал sad.gif
Приведу пример:
Мне надо запустить программу
Код
C:\WWW\PHP\php.exe
и передать ей параметры
Код
-lASD -ASDD

Таким образом функции я передаю строку следующего содержания:
Код
C:\WWW\PHP\php.exe -lASD -ASDD
И в свойствах ярлыка она заключается в кавычки, которых БЫТЬ НЕ ДОЛЖНО!

Надеюсь, сейчас понятно, что мне надо wink.gif

Автор: kruchinin 21.8.2003, 17:42
Могу только дать пример функции для создания ярлыка
Код

HRESULT CreateLink(LPCSTR lpszPathObj,
   LPSTR lpszPathLink, LPSTR lpszDesc, LPSTR lpszDir)
{
   HRESULT hres;
   IShellLink* psl;


   // Get a pointer to the IShellLink interface.
   hres = CoCreateInstance(CLSID_ShellLink, NULL,
       CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&psl);
   if (SUCCEEDED(hres)) {
       IPersistFile* ppf;

       // Set the path to the shortcut target, and add the
       // description.
       hres = psl->SetPath(lpszPathObj);

       hres = psl->SetDescription(lpszDesc);

 hres = psl->SetWorkingDirectory(lpszDir);

      // Query IShellLink for the IPersistFile interface for saving the
      // shortcut in persistent storage.
       hres = psl->QueryInterface( IID_IPersistFile,
           (void**)&ppf);

       if (SUCCEEDED(hres)) {
           WORD wsz[MAX_PATH];
 
 

           // Ensure that the string is ANSI.
           int i=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, lpszPathLink, -1,
               wsz, MAX_PATH);
 

           // Save the link by calling IPersistFile::Save.
           hres = ppf->Save(wsz , TRUE);
           ppf->Release();
       }
       psl->Release();
   }
   return hres;
}

1-й параметр - путь до exe файла
2-й параметр - путь до создаваемого ярлыка(соответственно и имя)
3-й параметр - название ярлыка
4-й параметр - рабочая папка ярлыка
Возможно некоторые параметры не совсем я верно описал, но у меня эта функция нормально создавала ярлыки. Кстати она взята (мной сильно доработана) из помощи Borland C++ 5.0

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