Как-то увидел вопрос "Как создать ярлык на рабочем столе?". Немного усовершенствовал функцию, чтобы могла создавать ярлык в произвольном месте. Но есть проблема: при присвоении полного пути к файлу, на к-ый он ссылается, заключается в кавычки (в свойствах, конечно), если в нем есть пробелы. То есть параметры передать нельзя. Как быть. Вот и сама функция: | Код | #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; } //--------------------------------------------------------------------------- |
|