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
|
|