Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ярлык 
V
    Опции темы
Kirgston
Дата 3.5.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток! Вот мне надо было сделать для моей программы ярлычок... нашёл в ВорлдС++ примерчик... только у меня с ним косяки...

Вот код:

Код

// Создание ярлыка
// Входные параметры:
//  pwzShortCutFileName - путь и имя ярлыка, например, "C:\\Блокнот.lnk"
//  Если не указан путь, ярлык будет создан в папке, указанной в следующем параметре.
//  Прим.: Windows сама НЕ добавляет к имени расширение .lnk
//  pszPathAndFileName  - путь и имя exe-файла, например, "C:\\Windows\\NotePad.Exe"
//  pszWorkingDirectory - рабочий каталог, например, "C:\\Windows"
//  pszArguments        - аргументы командной строки, например, "C:\\Doc\\Text.Txt"
//  wHotKey             - горячая клавиша, например, для Ctrl+Alt+A     HOTKEY(HOTKEYF_ALT|HOTKEYF_CONTROL,'A')
//  iCmdShow            - начальный вид, например, SW_SHOWNORMAL
//  pszIconFileName     - путь и имя файла, содержащего иконку, например, "C:\\Windows\\NotePad.Exe"
//  int iIconIndex      - индекс иконки в файле, нумеруется с 0

bool __fastcall TForm1::CreateShortCut(
                LPWSTR pwzShortCutFileName,
                LPTSTR pszPathAndFileName,
                LPTSTR pszWorkingDirectory,
                LPTSTR pszArguments,
                WORD wHotKey,
                int iCmdShow,
                LPTSTR pszIconFileName,
                int iIconIndex) {
   IShellLink * pSL;
   IPersistFile * pPF;
   HRESULT hRes;
   // Получение экземпляра компонента "Ярлык"
   hRes = CoCreateInstance(CLSID_ShellLink,
                           0,
                           CLSCTX_INPROC_SERVER,
                           IID_IShellLink,
                           (LPVOID *)&pSL);
   if( SUCCEEDED(hRes) ) {
      hRes = pSL->SetPath(pszPathAndFileName);
      if( SUCCEEDED(hRes) ) {
         hRes = pSL->SetArguments(pszArguments);
         if( SUCCEEDED(hRes) ) {
            hRes = pSL->SetWorkingDirectory(pszWorkingDirectory);
            if( SUCCEEDED(hRes) ) {
               hRes = pSL->SetIconLocation(pszIconFileName,iIconIndex);
               if( SUCCEEDED(hRes) ) {
                  hRes = pSL->SetHotkey(wHotKey);
                  if( SUCCEEDED(hRes) ) {
                     hRes = pSL->SetShowCmd(iCmdShow);
                     if( SUCCEEDED(hRes) ) {
                        // Получение компонента хранилища параметров
                        hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF);
                        if( SUCCEEDED(hRes) ) {
                           // Сохранение созданного ярлыка
                           hRes = pPF->Save(pwzShortCutFileName,TRUE);
                           pPF->Release();
                        }
                     }
                  }
               }
            }
         }
      }
      pSL->Release();
   }
   return SUCCEEDED(hRes);
}


Вызываю

Код

CreateShortCut("Travia.lnk","Travia.exe",GetCurrentDirectory(sizeof(buf),buf),"Set.txt",NULL,SW_SHOWNORMAL,"Travia.exe",0);


Дело в том что выкидывает ошибки... скажем первый параметр должен быть wchar_t * второй уже char * и т.д. Помогите пожалуйста свести типы. Да тема какбы довольно глупая... но я уже довольно долго с этим мучаюсь. Там был пример мол через Едиты (в них сводится к различным типам) но я не могу свести GetCurrentDirectory(sizeof(buf),buf) к нужному типу... - char *... помогите пожалуйста хотябы советами =)

З.Ы. знаю-знаю =) учи мат-часть. Учу =) просто не успеваю учить за своим рвением к написанию программ =)
PM MAIL   Вверх
Rififi
Дата 3.5.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



Kirgston, 
В интерфейсе IShellLink все строковые параметры одного типа - либо char*, либо wchar_t*, так что выкинь этот код на помойку
Гоогле => "c++ create shortcut"
PM MAIL   Вверх
Kirgston
Дата 3.5.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну смотрите... если я записываю скажем... без ГетКуррентДиректори а прямо путём то всё хорошо... но мне надо указать ту директорию где находится мой ехе :(
PM MAIL   Вверх
Данкинг
Дата 3.5.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(Kirgston @  4.5.2009,  00:56 Найти цитируемый пост)
но мне надо указать ту директорию где находится мой ехе :( 

Код

ExtractFilePath(Application->ExeName)

 smile

Добавлено через 54 секунды
Цитата(Kirgston @  4.5.2009,  00:14 Найти цитируемый пост)
Учу =) просто не успеваю учить за своим рвением к написанию программ =) 

Надо запомнить, хорошая отмазка. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Kirgston
Дата 4.5.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ага... это ЮникодСтринг... а там надо чар... переделать с юникода в чар нельзя вроде :(
PM MAIL   Вверх
Данкинг
Дата 4.5.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(Kirgston @  4.5.2009,  01:05 Найти цитируемый пост)
а там надо чар

А char - это не один символ разве в Билдере? smile Если да - то как можно директорию в нём передавать.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
A5uKa
Дата 4.5.2009, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



Цитата(Данкинг @ 4.5.2009,  00:17)
Цитата(Kirgston @  4.5.2009,  01:05 Найти цитируемый пост)
а там надо чар

А char - это не один символ разве в Билдере? smile Если да - то как можно директорию в нём передавать.

так
Цитата

 char *

PM   Вверх
586
Дата 4.5.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(Rififi @  4.5.2009,  00:33 Найти цитируемый пост)
В интерфейсе IShellLink все строковые параметры одного типа - либо char*, либо wchar_t*, так что выкинь этот код на помойку

 smile У IPersistFile только Юникод.
Цитата(Kirgston @  4.5.2009,  01:05 Найти цитируемый пост)
Ага... это ЮникодСтринг... а там надо чар... переделать с юникода в чар нельзя вроде :( 

А так пробовал:
Код
UnicodeString us;

AnsiString(us).c_str()

В шестом билдере у меня функция работает, а с UnicodeString не могу проверить.
Код
#define NO_WIN32_LEAN_AND_MEAN
#include <vcl.h>
#include <shlobj.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    CoInitialize(0);
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    CoUninitialize();
}

bool CreateShortCut(
                LPWSTR pwzShortCutFileName,
                LPTSTR pszPathAndFileName,
                LPTSTR pszWorkingDirectory,
                LPTSTR pszArguments,
                WORD wHotKey,
                int iCmdShow,
                LPTSTR pszIconFileName,
                int iIconIndex) {
   IShellLink * pSL;
   IPersistFile * pPF;
   HRESULT hRes;
   // Получение экземпляра компонента "Ярлык"
   hRes = CoCreateInstance(CLSID_ShellLink,
                           0,
                           CLSCTX_INPROC_SERVER,
                           IID_IShellLink,
                           (LPVOID *)&pSL);
   if( SUCCEEDED(hRes) ) {
      hRes = pSL->SetPath(pszPathAndFileName);
      if( SUCCEEDED(hRes) ) {
         hRes = pSL->SetArguments(pszArguments);
         if( SUCCEEDED(hRes) ) {
            hRes = pSL->SetWorkingDirectory(pszWorkingDirectory);
            if( SUCCEEDED(hRes) ) {
               hRes = pSL->SetIconLocation(pszIconFileName,iIconIndex);
               if( SUCCEEDED(hRes) ) {
                  hRes = pSL->SetHotkey(wHotKey);
                  if( SUCCEEDED(hRes) ) {
                     hRes = pSL->SetShowCmd(iCmdShow);
                     if( SUCCEEDED(hRes) ) {
                        // Получение компонента хранилища параметров
                        hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF);
                        if( SUCCEEDED(hRes) ) {
                           // Сохранение созданного ярлыка
                           hRes = pPF->Save(pwzShortCutFileName,TRUE);
                           pPF->Release();
                        }
                     }
                  }
               }
            }
         }
      }
      pSL->Release();
   }
   return SUCCEEDED(hRes);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String exeFileName = "C:\\WINDOWS\\system32\\mspaint.exe";
    String lnkFileName = "C:\\paint.lnk";

    Caption = (int)CreateShortCut(
        WideString(lnkFileName).c_bstr(),       // shortcut path
        exeFileName.c_str(),                    // exe path
        ExtractFileDir(exeFileName).c_str(),    // current dir
        "",                                     // program parameters
        0,                                      // hot key
        SW_SHOWNORMAL,                          // show command
        exeFileName.c_str(),                    // icon file
        0);                                     // icon index
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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