Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Ярлык


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

Вот код:

Код

// Создание ярлыка
// Входные параметры:
//  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 *... помогите пожалуйста хотябы советами =)

З.Ы. знаю-знаю =) учи мат-часть. Учу =) просто не успеваю учить за своим рвением к написанию программ =)

Автор: Rififi 3.5.2009, 23:33
Kirgston, 
В интерфейсе IShellLink все строковые параметры одного типа - либо char*, либо wchar_t*, так что выкинь этот код на помойку
Гоогле => "c++ create shortcut"

Автор: Kirgston 3.5.2009, 23:56
Ну смотрите... если я записываю скажем... без ГетКуррентДиректори а прямо путём то всё хорошо... но мне надо указать ту директорию где находится мой ехе :(

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

Код

ExtractFilePath(Application->ExeName)

 smile

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

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

Автор: Kirgston 4.5.2009, 00:05
Ага... это ЮникодСтринг... а там надо чар... переделать с юникода в чар нельзя вроде :(

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

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

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

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

так
Цитата

 char *

Автор: 586 4.5.2009, 08:42
Цитата(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
}

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