On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
Администратор




Пост N: 343
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.10.06 08:27. Заголовок: Ярлык lnk


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


Спасибо: 0 
Профиль
Ответов - 14 [только новые]


модератор




Пост N: 319
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 20.10.06 10:54. Заголовок: Исходники из поставки HMG Extended release


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

Спасибо: 0 
Профиль
Администратор




Пост N: 345
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.10.06 11:12. Заголовок: Re:


Спасибо

Я смотрю в минигуи как в Греции все есть

samples\advanced\easyinstall

Надо только пошукать :)

Спасибо: 0 
Профиль
модератор




Пост N: 320
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 20.10.06 12:17. Заголовок: Re:


Pasha пишет:

 цитата:
Я смотрю в минигуи как в Греции все есть


(c) Стараемся, создаем настроение... (И.И.Бывалов)


Спасибо: 0 
Профиль
Администратор




Пост N: 346
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.10.06 14:13. Заголовок: Re:


А не Огурцов ? :)
Бывалов это Волга-Волга мабуть

Григорий, мне тут понадобился инсталлятор, и я решил не изобретать велосипед

Возьму EasyInstall, только русифицирую его конечно

Национализированные сырцы пришлю почтой

Делаю через макросы:
#define _LANG_EN
#define _LANG_RU

Пойдет за милую душу собранный вместе с harbour.dll и hbzipdll.dll, тем более эти
dll-ки все равно идут для моих программ.

btw еще надо добавить копирование инсталлятором этих dll-к в cDestinPath
Надо добавить параметр в setup.ini

Заодно как узнать правильный путь к "C:\Program Files" ?


Спасибо: 0 
Профиль
модератор




Пост N: 321
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 20.10.06 14:41. Заголовок: Re:


Pasha пишет:

 цитата:
как узнать правильный путь к "C:\Program Files" ?


В библиотеке MiniGUI есть функция GetProgramFilesFolder().
Возвращает путь к папке Program Files без конечного слэша

Pasha пишет:

 цитата:
Национализированные сырцы пришлю почтой


Буду ждать...


Спасибо: 0 
Профиль
постоянный участник




Пост N: 41
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.10.06 19:42. Заголовок: Re:


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

Спасибо: 0 
Профиль





Пост N: 64
Зарегистрирован: 02.02.06
ссылка на сообщение  Отправлено: 20.10.06 22:18. Заголовок: Re:


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

Спасибо: 0 
Профиль
Администратор




Пост N: 347
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.10.06 09:37. Заголовок: Re:


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

Спасибо: 0 
Профиль
постоянный участник




Пост N: 169
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.12.06 19:11. Заголовок: Re:


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


Спасибо: 0 
Профиль
постоянный участник




Пост N: 335
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.09.07 00:51. Заголовок: Re:


Переписал под хХарбор вышеприведенный исходник (не прошло и 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




Спасибо: 0 
Профиль
постоянный участник




Пост N: 337
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.09.07 02:30. Заголовок: Re:


Подскажите, как можно сделать ярлык на папку ?

Что нужно модифицировать в исходнике ?



Спасибо: 0 
Профиль
постоянный участник




Пост N: 344
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.10.07 22:06. Заголовок: Re:


Народ !!!

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

Спасибо: 0 
Профиль
постоянный участник


Пост N: 66
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 04.10.07 06:20. Заголовок: Re:


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


Спасибо: 0 
Профиль
постоянный участник




Пост N: 348
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.10.07 22:00. Заголовок: Re:


Vlad04 пишет:

 цитата:
максимум - архиватор.



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

Я тоже люблю свои файлы программы держать в своей-одной папке.

Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 300
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет