Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция создания ярлыка в любой дир-ии 
:(
    Опции темы
Коп
  Дата 30.7.2003, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 11.7.2002

Репутация: нет
Всего: нет



Как-то увидел вопрос "Как создать ярлык на рабочем столе?". Немного усовершенствовал функцию, чтобы могла создавать ярлык в произвольном месте. Но есть проблема: при присвоении полного пути к файлу, на к-ый он ссылается, заключается в кавычки (в свойствах, конечно), если в нем есть пробелы. То есть параметры передать нельзя. Как быть.

Вот и сама функция:

Код
#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);
//Создает несколько вложенных директорий
bool __fastcall CreateRandDir(char *new_dir, LPSECURITY_ATTRIBUTES Attribs = NULL);
//---------------------------------------------------------------------------

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)] = '\0';
  }
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 TMIcon::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;
}
//---------------------------------------------------------------------------

bool __fastcall CreateRandDir(char *new_dir, LPSECURITY_ATTRIBUTES Attribs)
{//Создает несколько вложенных дир-ий
//Пример: на диске есть C:\SomeDir\ надо создать C:\SomeDir\Dir1\Dir2\Dir3\
//Нужна фун-ия Is_Dir
char *buff = (char *) calloc (1, MAXPATH);
memcpy(buff, new_dir, MAXPATH);
while (!Is_Dir(buff))
     {
     buff[strlen(buff) - strlen(strrchr(buff, '\\'))] = '\0';
     }
//Теперь buff содержит полное имя последней сущ-ей дир-ии
if (!strcmp(buff, new_dir)) return true;
for (int i = 0; i<=strlen(buff); i++) new_dir++;
while(new_dir[0] != '\0')
     {
     strcat(buff, "\\");
     while ((new_dir[0] != '\\') && (new_dir[0] != '\0'))
           {
           strncat(buff, new_dir, 1);
           new_dir++;
           }
     if (new_dir[0] != '\0') new_dir++;
     if (!CreateDirectory(buff, Attribs)) return false;
     }
return true;
}
//---------------------------------------------------------------------------

PM MAIL ICQ   Вверх
Ziga
Дата 31.7.2003, 15:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











jeslji praviljno ponjel, to naprimer
char* prog_name = "\"C:\Program Files\Common Files\some.exe\" \"param 1\" param_2";
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.