C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

  ЗакрытаНовая темаНовый опрос
Установить иконку на Desktop
Fred
Отправлено: 31.05.2003, 00:01


Не зарегистрирован







Необходимо чтобы при первом запуске программа устанавливала на рабочем столе иконку и связывала ее с этой программой для последующих запусков. Подскажите, кто знает, как такое можно сделать ?

С уважением, Fred.
Guest
Отправлено: 31.05.2003, 13:30


Не зарегистрирован







QUOTE (Fred @ 31 May 2003, 00:01)
Необходимо чтобы при первом запуске программа устанавливала на рабочем столе иконку и связывала ее с этой программой для последующих запусков. Подскажите, кто знает, как такое можно сделать ?

С уважением, Fred.

Fred. а в какомкомпиляторе вы собираете прогу???
Admin
Отправлено: 31.05.2003, 16:45


Владимир

Группа: Администратор
Сообщений: 1190



Насколько я понимаю, обычно это делается при установке
программы в InstallShieldExpress

А иконку прописать на рабочем столе можно и программно:

Пример из архива старого форума

Fred
Отправлено: 31.05.2003, 19:34


Не зарегистрирован







Программа делается на CBuilder`е.
Спасибо за ссылку, Владимир. Похоже это именно то что мне нужно. Сейчас буду разбираться.
Admin
Отправлено: 31.05.2003, 21:08


Владимир

Группа: Администратор
Сообщений: 1190



К сожалению с этим примером я до конца не разбирался,
но у меня заработало частично — вот так:
(под С++Builder6 и Windows2000 и WindowsME)

CODE


#include <shlobj.h>
#include <atlbase.h>
#include <ComObj.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{

AnsiString fname = ParamStr(0);

CComPtr<IUnknown> shl_obj;
shl_obj.CoCreateInstance(CLSID_ShellLink);
CComQIPtr<IShellLink, &IID_IShellLinkA> shl_lnk(shl_obj);
OleCheck(shl_lnk->SetPath(fname.c_str()));
OleCheck(shl_lnk->SetWorkingDirectory(ExtractFilePath(fname).c_str()));
CComPtr<IMalloc> alloc;
OleCheck(SHGetMalloc(&alloc));
LPITEMIDLIST items;
if (SUCCEEDED(SHGetSpecialFolderLocation(Handle, CSIDL_DESKTOP, &items)))
try {
char path[MAX_PATH];
SHGetPathFromIDList(items, path);

char buff[MAX_PATH];
sprintf(buff, "%hs\\my test program.lnk", path);
ShowMessage(buff);

// вот здесь ниже происходит ошибка — при преобразовании
// в wchar_t русских букв (если у Вас русский Windows и в названии
// есть например слова "Рабочий стол")
// при установке ярлыка в папку только с английским путем -
//  все нормально, ярлык создается

wchar_t buf[MAX_PATH];
swprintf(buf, L"%hs", buff);
ShowMessage(buf); // обратите внимание как преобразовались буквы


OleCheck(CComQIPtr<IPersistFile>(shl_obj)->Save(buf, false));
} __finally {
alloc->Free(items);
}
}



Сначала компилятор ругался на Multiple Declaration в .h файлах,
все эти места я просто заккоментировал и ошибки пропали,
проект откомпилился и запустился и работает, ярлыки создает,
если удастся разобраться как обойти ошибку при преобразовании
русских букв char в wchar_t — выложите здесь,
а также если удасться найти более простое решение
Fred
Отправлено: 31.05.2003, 21:55


Не зарегистрирован







Чтобы избежать ошибок компилятора, я воспользовался советом из исходного примера:

Для нормальной компиляции примера нужно:
- объявить Conditional define: NO_WIN32_LEAN_AND_MEAN

Проблему перевода русских букв в wchar_t обошел следующим образом:
CODE

try {
    char   path[MAX_PATH]; SHGetPathFromIDList(items, path);
    wchar_t buf[MAX_PATH];

    AnsiString s = AnsiString(path) + "\\my test program.lnk";

    OleCheck( CComQIPtr<IPersistFile>(shl_obj)->Save( s.WideChar(buf,MAX_PATH), false) );
   }


У меня прекрасно сработало.
CBuilder 5. W2000.
Admin
Отправлено: 31.05.2003, 22:24


Владимир

Группа: Администратор
Сообщений: 1190



Ок. Тогда тему закрываю.

А почему Unregistered ?
Регистрируйтесь и заходите под своим именем. Удобней.

Отредактировано Admin — 31 May 2003, 22:27

Вернуться в Вопросы программирования в C++Builder
ЗакрытаНовая темаНовый опрос