Форум

Ярлык lnk

Pasha: Можно ли средствами winapi создать ярлык к программе - файл *.lnk со ссылкой на exe и переписать его на рабочий стол ?

Ответов - 14

gfilatov: Pasha пишет: Можно ли средствами winapi создать ярлык к программе - файл *.lnk со ссылкой на exe и переписать его на рабочий стол ? /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2002-06 Roberto Lopez <roblez@ciudad.com.ar> * http://www.geocities.com/harbour_minigui/ * * Copyright 2003-06 Grigory Filatov <gfilatov@freemail.ru> */ #include "minigui.ch" #define PROGRAM "Link Executor" #define VERSION ' version 1.1' #define COPYRIGHT ' 2003-2006 by Grigory Filatov' #define IDI_1 1001 #define CSIDL_PROGRAMS 2 #define FALSE .F. #define TRUE .T. *--------------------------------------------------------* Procedure Main *--------------------------------------------------------* SET MULTIPLE OFF DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 354 ; HEIGHT IF(IsXPThemeActive(), 120, 115) ; TITLE PROGRAM ; ICON 'IDI_MAIN' ; MAIN ; NOMAXIMIZE NOSIZE ; ON INIT Form_1.CONTROL_4.SetFocus ; ON MOUSECLICK MsgAbout() ; FONT 'Tahoma' ; SIZE 9 @ 2,6 FRAME CONTROL_1 ; CAPTION 'Create Link' ; WIDTH 242 ; HEIGHT 80 @ 20,24 CHECKBOX CONTROL_2 ; CAPTION 'On Desktop' ; WIDTH 220 ; HEIGHT 30 ; VALUE FALSE @ 46,24 CHECKBOX CONTROL_3 ; CAPTION 'In "Start/Programs" Menu' ; WIDTH 220 ; HEIGHT 30 ; VALUE FALSE @ 10,262 BUTTON CONTROL_4 ; CAPTION 'OK' ; ACTION ( CreateLink(Form_1.CONTROL_2.Value, Form_1.CONTROL_3.Value), ; Form_1.Release ) ; WIDTH 74 ; HEIGHT 22 @ 40,262 BUTTON CONTROL_5 ; CAPTION 'Cancel' ; ACTION Form_1.Release ; WIDTH 74 ; HEIGHT 22 END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 return *--------------------------------------------------------* Static Procedure CreateLink( lDesk, lMenu ) *--------------------------------------------------------* Local cFileName := Lower( GetStartUpFolder() + "\" + cFileNoExt(GetExeFileName()) ) + '.ini' Local cDesktop := GetDesktopFolder(), cMenuPrgs := GetSpecialFolder( CSIDL_PROGRAMS ) Local cLinkName := "Calculator" Local cExeName := GetWindowsFolder() + "\Calc.exe" Local cIco := "" IF !FILE(cFileName) BEGIN INI FILE cFileName SET SECTION "Options" ENTRY "LinkName" TO cLinkName SET SECTION "Options" ENTRY "FileName" TO cExeName END INI ENDIF BEGIN INI FILE cFileName GET cLinkName SECTION "Options" ENTRY "LinkName" DEFAULT cLinkName GET cExeName SECTION "Options" ENTRY "FileName" DEFAULT cExeName END INI cIco := cExeName if lDesk if CreateFileLink( cDesktop + "\" + cLinkName, cExeName, cFilePath(cExeName), cIco ) # 0 MsgStop( "Create Link Error!", PROGRAM, , .f. ) endif endif if lMenu if CreateFileLink( cMenuPrgs + "\" + cLinkName, cExeName, cFilePath(cExeName), cIco ) # 0 MsgStop( "Create Link Error!", PROGRAM, , .f. ) endif endif Return *--------------------------------------------------------* Static Function MsgAbout() *--------------------------------------------------------* Return MsgInfo( padc(PROGRAM + VERSION, 40) + CRLF + ; padc("Copyright " + Chr(169) + COPYRIGHT, 40) + CRLF + CRLF + ; hb_compiler() + CRLF + version() + CRLF + ; Left(MiniGuiVersion(), 28) + CRLF + CRLF + ; padc("This program is Freeware!", 36) + CRLF + ; padc("Copying is allowed!", 40), "About", IDI_1, .f. ) #pragma BEGINDUMP #include <windows.h> #include <commctrl.h> #include "hbapi.h" #include "hbvm.h" #include "hbstack.h" #include "hbapiitm.h" #include <ShlObj.h> /***************************************************************************\ * * * Autor: Jose F. Gimenez (JFG) * * <jfgimenez@wanadoo.es> <tecnico.sireinsa@ctv.es> * * * * Fecha: 2000.10.02 * * * \***************************************************************************/ void ChangePIF(LPCSTR cPIF) { UCHAR buffer[1024]; HFILE h; long filesize; strcpy(buffer, cPIF); strcat(buffer, ".pif"); if ((h=_lopen(buffer, 2))>0) { filesize=_hread(h, &buffer, 1024); buffer[0x63]=0x10; // Cerrar al salir buffer[0x1ad]=0x0a; // Pantalla completa buffer[0x2d4]=0x01; buffer[0x2c5]=0x22; // No Permitir protector de pantalla buffer[0x1ae]=0x11; // Quitar ALT+ENTRAR buffer[0x2e0]=0x01; _llseek(h, 0, 0); _hwrite(h, buffer, filesize); _lclose(h); } } HRESULT WINAPI CreateLink(LPSTR lpszLink, LPSTR lpszPathObj, LPSTR lpszWorkPath, LPSTR lpszIco, int nIco) { long hres; IShellLink * psl; hres = CoInitialize(NULL); if (SUCCEEDED(hres)) { hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, ( LPVOID ) &psl); if (SUCCEEDED(hres)) { IPersistFile * ppf; psl->lpVtbl->SetPath(psl, lpszPathObj); psl->lpVtbl->SetIconLocation(psl, lpszIco, nIco); psl->lpVtbl->SetWorkingDirectory(psl, lpszWorkPath); hres = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, ( LPVOID ) &ppf); if (SUCCEEDED(hres)) { WORD wsz[MAX_PATH]; char cPath[MAX_PATH]; strcpy(cPath, lpszLink); strcat(cPath, ".lnk"); MultiByteToWideChar(CP_ACP, 0, cPath, -1, wsz, MAX_PATH); hres = ppf->lpVtbl->Save(ppf, wsz, TRUE); ppf->lpVtbl->Release(ppf); // modificar el PIF para los programas MS-DOS ChangePIF(lpszLink); } psl->lpVtbl->Release(psl); } CoUninitialize(); } return hres; } /***************************************************************************/ HB_FUNC( CREATEFILELINK ) { hb_retnl( (LONG) CreateLink( hb_parc(1), hb_parc(2), hb_parc(3), hb_parc(4), (hb_pcount() > 4) ? hb_parni(5) : 0) ); } #pragma ENDDUMP

Pasha: Спасибо Я смотрю в минигуи как в Греции все есть samples\advanced\easyinstall Надо только пошукать :)

gfilatov: Pasha пишет: Я смотрю в минигуи как в Греции все есть (c) Стараемся, создаем настроение... (И.И.Бывалов)


Pasha: А не Огурцов ? :) Бывалов это Волга-Волга мабуть Григорий, мне тут понадобился инсталлятор, и я решил не изобретать велосипед Возьму EasyInstall, только русифицирую его конечно Национализированные сырцы пришлю почтой Делаю через макросы: #define _LANG_EN #define _LANG_RU Пойдет за милую душу собранный вместе с harbour.dll и hbzipdll.dll, тем более эти dll-ки все равно идут для моих программ. btw еще надо добавить копирование инсталлятором этих dll-к в cDestinPath Надо добавить параметр в setup.ini Заодно как узнать правильный путь к "C:\Program Files" ?

gfilatov: Pasha пишет: как узнать правильный путь к "C:\Program Files" ? В библиотеке MiniGUI есть функция GetProgramFilesFolder(). Возвращает путь к папке Program Files без конечного слэша Pasha пишет: Национализированные сырцы пришлю почтой Буду ждать...

Andrey: Слушайте, а инсталятор нужен всем. А в исходниках тем более. Хотя я пока в MiniGUI не разбираюсь, поделитесь. На будущее.

Сергей Р: А чем не нравятся уже готовые программы , например бесплатная Inno Setup Compiler ? P.S. http://www.jrsoftware.org/isinfo.php есть исходники , можно найти русификатор

Pasha: Он же свободный Достаточно выкачать минигуи и в примерах он сидит Останется только собрать Я русифицированную версию думаю Григорий обновит

Andrey: Подскажите, а можно без МИНИГУИ создать ярлык для программы ?

Andrey: Переписал под хХарбор вышеприведенный исходник (не прошло и 9 месяцев), все получилось, но как сделать чтоб параметр ОКНО: стало "Развернутое на весь экран" Привожу исходник: /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2002-06 Roberto Lopez <roblez@ciudad.com.ar> * http://www.geocities.com/harbour_minigui/ * * Copyright 2003-06 Grigory Filatov <gfilatov@freemail.ru> * * Добавил для xHarbour - Верченко Андрей Геннадьевич <30195@mail.ru> */ #define PROGRAM "Link Executor" #define VERSION ' version 1.2 for xHarbour' #define COPYRIGHT ' 2003-2006 by Grigory Filatov + Verchenko Andrey' // Смотреть h_winapimisc.prg MINIGUI #define CSIDL_PROGRAMS 0x0002 // Start Menu\Programs #define CSIDL_PROGRAM_FILES 0x0026 // C:\Program Files #define CSIDL_DESKTOPDIRECTORY 0x0010 // <user name>\Desktop #define CSIDL_WINDOWS 0x0024 // GetWindowsDirectory() #define CRLF CHR(13)+CHR(10) #define FALSE .F. #define TRUE .T. #include "box.ch" #include "inkey.ch" #include "getexit.ch" *--------------------------------------------------------* FUNCTION Main() *--------------------------------------------------------* LOCAL CONTROL_2 := FALSE , CONTROL_3 := FALSE Local GETLIST:={}, lCancel := TRUE, lOk := TRUE, nExitState := GE_ESCAPE request HB_CODEPAGE_RU866 hb_setcodepage( "RU866" ) request HB_LANG_RU866 hb_langselect( "RU866" ) set( _SET_EVENTMASK, INKEY_ALL ) cls SETMODE(15,40) Setcolor('w/b+,r/b,g+/r,b+/r+,bg/n+,w/bg,rb/bg') SETCOLOR("1/15,0/15,1/15,4/15,5/15,3/1,10/1,1/2") dispbox( 4, 2, 7, 35, B_SINGLE_DOUBLE+" " ) @ 4, 5 SAY ' Create Link ' @ 5, 5 GET CONTROL_2 CHECKBOX CAPTION "On Desktop" color '0/15,15/0,0/15,1/14' MESSAGE "На Рабочем столе ?" @ 6, 5 GET CONTROL_3 CHECKBOX CAPTION 'In "Start/Programs" Menu' color '0/15,15/0,0/15,1/14' MESSAGE "В меню Пуск/Программы ?" @ 9, 10 GET lOk PUSHBUTTON ; CAPTION " &Ok " ; STATE { || GetActive():exitState := GE_WRITE } ; WHEN { || nExitState := GE_WRITE, TRUE } @ 9, 20 GET lCancel PUSHBUTTON ; CAPTION "&Cancel" ; STATE { || GetActive():exitState := GE_ESCAPE } ; WHEN { || nExitState := GE_ESCAPE, TRUE } READ MSG AT maxrow(), 0, maxcol() MSG Color "w/b+" IF nExitState == 6 CreateLink(CONTROL_2, CONTROL_3) ENDIF return NIL *--------------------------------------------------------* Static Procedure CreateLink( lDesk, lMenu ) *--------------------------------------------------------* Local cFileName := SUBSTR(EXENAME(), 1, RAT(".",EXENAME() ) - 1 ) + '.ini' Local cDesktop := GetDesktopFolder() LOCAL cMenuPrgs := GetSpecialFolder( CSIDL_PROGRAMS ) Local cLinkName := HB_OEMTOANSI("Калькулятор 1.0") Local cExeName := IIF(OS_ISWINNT() == .T.,"%SystemRoot%\system32",GetWindowsFolder() ) + "\Calc.exe" Local cIco := "", hIni IF !FILE(cFileName) hIni := Hash() hIni["MAIN" ] := Hash() hIni["MAIN" ]["Proga"] := PROGRAM hIni["MAIN" ]["Ver" ] := VERSION hIni["Options" ] := Hash() hIni["Options" ]["LinkName"] := cLinkName hIni["Options" ]["FileName"] := cExeName HB_WriteIni( cFileName, hIni, ; "; Start comment", "; End comment" ) ELSE hIni := HB_ReadIni( cFileName ) cLinkName := hIni["Options"]["LinkName"] cExeName := hIni["Options"]["FileName"] ENDIF cIco := cExeName if lDesk if CreateFileLink( cDesktop + "\" + cLinkName, cExeName, cFilePath(cExeName), cIco ) # 0 MsgStop( "Create Link Error!", PROGRAM, , .f. ) endif endif if lMenu if CreateFileLink( cMenuPrgs + "\" + cLinkName, cExeName, cFilePath(cExeName), cIco ) # 0 MsgStop( "Create Link Error!", PROGRAM, , .f. ) endif endif Return *--------------------------------------------------------* Function MsgStop(x1,x2,x3,x4) *--------------------------------------------------------* ALERT( x2+"; ;"+x1) RETURN NIL * ---------------- я написал, может что не правильно, то поправте ------------* Function GETWINDOWSDIR() *-----------------------------------------------------------------------------* local lfolder lfolder:=getspecialfolder(CSIDL_WINDOWS) return lfolder *--------------------------------------------------------* Function cFilePath( cPathMask ) // MINIGUI - h_controlmisc.prg *--------------------------------------------------------* LOCAL n := RAt( "\", cPathMask ) return If( n > 0, Upper( Left( cPathMask, n - 1) ), Left( cPathMask, 2 ) ) /*---------------------------------------------------------------------------- MINIGUI - Harbour Win32 GUI library source code Copyright 2002 Roberto Lopez <roblez@ciudad.com.ar> http://www.geocities.com/harbour_minigui/ Извлечено из h_winapimisc.prg MINIGUI */ Function GetWindowsFolder() *-----------------------------------------------------------------------------* local lfolder lFolder := GETWINDOWSDIR() return lfolder Function GetDesktopFolder() *-----------------------------------------------------------------------------* local lfolder lfolder:=getspecialfolder(CSIDL_DESKTOPDIRECTORY) return lfolder *-----------------------------------------------------------------------------* *-----------------------------------------------------------------------------* Function GETSPECIALFOLDER(nCSIDL) // Contributed By Ryszard Rylko *-----------------------------------------------------------------------------* Local RetVal RetVal:= C_getspecialfolder(nCSIDL) return RetVal #pragma BEGINDUMP #include <windows.h> #include <commctrl.h> #include "hbapi.h" #include "hbvm.h" #include "hbstack.h" #include "hbapiitm.h" #include <ShlObj.h> /***************************************************************************\ * * * Autor: Jose F. Gimenez (JFG) * * <jfgimenez@wanadoo.es> <tecnico.sireinsa@ctv.es> * * * * Fecha: 2000.10.02 * * * \***************************************************************************/ void ChangePIF(LPCSTR cPIF) { UCHAR buffer[1024]; HFILE h; long filesize; strcpy(buffer, cPIF); strcat(buffer, ".pif"); if ((h=_lopen(buffer, 2))>0) { filesize=_hread(h, &buffer, 1024); buffer[0x63]=0x10; // Cerrar al salir buffer[0x1ad]=0x0a; // Pantalla completa buffer[0x2d4]=0x01; buffer[0x2c5]=0x22; // No Permitir protector de pantalla buffer[0x1ae]=0x11; // Quitar ALT+ENTRAR buffer[0x2e0]=0x01; _llseek(h, 0, 0); _hwrite(h, buffer, filesize); _lclose(h); } } HRESULT WINAPI CreateLink(LPSTR lpszLink, LPSTR lpszPathObj, LPSTR lpszWorkPath, LPSTR lpszIco, int nIco) { long hres; IShellLink * psl; hres = CoInitialize(NULL); if (SUCCEEDED(hres)) { hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, ( LPVOID ) &psl); if (SUCCEEDED(hres)) { IPersistFile * ppf; psl->lpVtbl->SetPath(psl, lpszPathObj); psl->lpVtbl->SetIconLocation(psl, lpszIco, nIco); psl->lpVtbl->SetWorkingDirectory(psl, lpszWorkPath); hres = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, ( LPVOID ) &ppf); if (SUCCEEDED(hres)) { WORD wsz[MAX_PATH]; char cPath[MAX_PATH]; strcpy(cPath, lpszLink); strcat(cPath, ".lnk"); MultiByteToWideChar(CP_ACP, 0, cPath, -1, wsz, MAX_PATH); hres = ppf->lpVtbl->Save(ppf, wsz, TRUE); ppf->lpVtbl->Release(ppf); // modificar el PIF para los programas MS-DOS ChangePIF(lpszLink); } psl->lpVtbl->Release(psl); } CoUninitialize(); } return hres; } /***************************************************************************/ HB_FUNC( CREATEFILELINK ) { hb_retnl( (LONG) CreateLink( hb_parc(1), hb_parc(2), hb_parc(3), hb_parc(4), (hb_pcount() > 4) ? hb_parni(5) : 0) ); } #pragma ENDDUMP #pragma BEGINDUMP // из MINIGUI #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( C_GETSPECIALFOLDER ) // Contributed By Ryszard Ry№ko { char *lpBuffer = (char*) hb_xgrab( MAX_PATH+1); LPITEMIDLIST pidlBrowse; // PIDL selected by user SHGetSpecialFolderLocation(GetActiveWindow(), hb_parni(1), &pidlBrowse) ; SHGetPathFromIDList(pidlBrowse, lpBuffer); hb_retc(lpBuffer); hb_xfree( lpBuffer); } #pragma ENDDUMP

Andrey: Подскажите, как можно сделать ярлык на папку ? Что нужно модифицировать в исходнике ?

Andrey: Народ !!! Кто может подсказать: как можно сделать ярлык на папку программой ? Спасибо.

Vlad04: Об инсталяторах.Желательно без инсталяций обходиться, максимум - архиватор. Сейчас вообще популярными становятся программы - portable.Не засоряют компьютер, не оставляют следов и т.д.

Andrey: Vlad04 пишет: максимум - архиватор. А как сделать в архиваторе следующие действия: 1) создать ярлык на папку - документации программы ? 2) зарегистрировать чужую DLL используемую в своей программе ? Я тоже люблю свои файлы программы держать в своей-одной папке.



полная версия страницы