Página 1 de 2

Colocar um ATALHO no Desktop do Windows (Em puro MS-DOS)

Enviado: 13 Set 2007 20:23
por Pablo César
Quem disse que não podemos elaborar uma rotina para que seja criado "automaticamente" um ATALHO na hora da instalação do nossos sistemas ?. E ainda através de um arquivo de lote (BATCH FILE)... pois é, encontrei duas soluções que existem desde finais de 1999 (uma para WIN98 e outra para WINXP). O link é http://www.robvanderwoude.com/shortcutinf.html o qual basea-se na criação de um arquivo .INF e processado pelo SETUPX.DLL do próprio WINDOWS através do aplicativo RUNDLL.EXE

Peguei um exemplo do autor "Walter Zackery" e modifiquei um pouco para tentar entender esse procedimento. E que vocês poderão conferir abaixo, mas atenção é para WIN98:

Criar um arquivo TESTE.BAT com o seguinte conteúdo:

Código: Selecionar todos

LINK98 C:\WINDOWS\NOTEPAD.EXE C:\WINDOWS\DESKTOP C:\WINDOWS\MENUIN~1\PROGRA~1 ICONE
Depois criar o outro arquivo em lote chamado LINK98.BAT com o seguinte conteúdo:

Código: Selecionar todos

@echo off
::A batch file for Windows 95/98 that creates LNK shortcuts.
::Author: Walter Zackery
::December 2,1999
if %4[==[ goto syntax
if not exist %1 if not exist %1\nul goto syntax
for %%? in (%2 %3) do if not exist %%?\nul goto syntax
%5 %0 %1 %2 %3 %4 rem "PASTA" InstallHinfSection
echo > %temp%\#path#.bat path %path%
path %1
echo > %temp%\#k#.inf [version]
echo >>%temp%\#k#.inf signature="$chicago$"
echo >>%temp%\#k#.inf [DefaultInstall]
echo >>%temp%\#k#.inf UpdateInis=Addlink
echo >>%temp%\#k#.inf [Addlink]
echo >>%temp%\#k#.inf setup.ini, progman.groups,, "group0=%6"
echo >>%temp%\#k#.inf setup.ini, group0,, ""%6""
echo >>%temp%\#k#.inf setup.ini, group0,,""%4",""%path%"",,0,"
for %%? in (call del) do %%? %temp%\#path#.bat
start/w rundll setupx.dll,%7 DefaultInstall 132 %temp%\#k#.inf
::del %temp%\#k#.inf
move %3\PASTA\%4.lnk %2 > nul
rd "%3\PASTA"
goto end
:syntax
for %%? in (cls echo[) do %%?
echo O quarto parametro deve ser passado para o arquivo em lote
echo na mesma ordem. Näo coloque barra-invetida no final de cada
echo parametro que é passado para o arquivo em lote.
echo Nomes longos de arquivo devem estar entre aspas.
echo[
echo O primeiro parametro deve ser o nome do arquivo ou pasta
echo ao qual será acessado pelo atalho criado.
echo[
echo O segundo parametro deve ser o local da pasta onde irá
echo ser criado o atalho.
for %%? in (pause cls echo[) do %%?
echo O terceiro paremetro deve ser o local da pasta onde se encontram
echo seu programas. Essa pasta deve conter a maioria dos acessos pelo
echo menu iniciar e normalmente é C:\Windows\Menu Iniciar\programas. 
echo Se voce está usando perfís entäo deve considerar a pasta como
echo c:\Windows\perfis\%%username%%\Menu Iniciar\Programas, onde
echo %%username%% é o nome do usuário. Note que se informar errado
echo a localizaçäo da pasta de Programas, o atalho irá ser criado
echo mas ele näo será movido para a pasta que foi especificada.
echo No entanto o arquivo irá permanecer no Menu Iniciar com o nome
echo de PASTA.
echo[
echo O quarto parametro deve ser a descrição e nome que voce que dar
echo para o atalho. Näo adicione a extensäo para o nome ao menos
echo que voce queira que faça parte do nome do atalho.
:end
Depois de criados esses dois arquivos em lote, é só executar o TESTE.BAT que irá criar um ícone do NOTEPAD na áera de trabalho do Windows chamado "ICONE".

Existe outro procedimento para WINXP, mas eu ainda não testei. Acho que poderia ser feito um aplicativo em Clipper que iria criar o arquivo .INF e executar o RUNDLL.EXE ou RUNDLL32.EXE. Para essa questão poderia nos auxiliar com a WAPI.LIB do Maligno para obter caminho correto do DESKTOP (das diferente versões do Windows, XP, 98) e quem sabe o Maligno ainda possa incluir mais estas funções na WAPI ?. O quê você acha Maligno ?. Material parece haver bastante a respeito. Eu encontrei algo que talvez possa a ser familiar à sua linguagem:

http://mail.python.org/pipermail/python ... 15799.html
http://www.mytips123.com/articles/37/1/ ... .LNK)-File

Acho que utilizando a WAPI.LIB irá sintetisar muitas funções que é necessário para a criação de atalhos, seja em WIN98 ou XP.

Enviado: 13 Set 2007 21:11
por Maligno
Mas é claro. Vou adicionar na TODO list a criação de atalhos para os SOs. É pena que as coisas estão meio difíceis aqui. Estou terminando umas alterações meio complicadas aqui e acabei ficando meio enrolado. Mas acho que a partir do final do mês as coisas voltarão a seguir normalmente. :)

Enviado: 13 Set 2007 21:27
por Pablo César
Che Gióia ! A WAPI.LIB vai ficar muito famosa. Pelo que eu estou vendo vai ficar uma excelente ferramenta para o Clipper e aplicativo para outras linguagens em modo console. Não tem palavras para te agradecer Maligno.
Estou terminando umas alterações meio complicadas aqui e acabei ficando meio enrolado.
E pelo que lí em outro tópico você teve problemas no seu Windows... maledetto Windows !.

Enviado: 13 Set 2007 21:50
por Maligno
Pablo César escreveu:E pelo que lí em outro tópico você teve problemas no seu Windows... maledetto Windows !.
Pois é. Pra você ver como são as coisas. Há algum tempo meu computador estava desligando sozinho sem motivo. Vários e vários dias depois descobri que era um tirístor mal soldado dentro da fonte. Ele estava encostando a pontinha de cima num dissipador, que conforme esquentava, o tirístor esquentava junto, até que num certo ponto ele cortava por conta da alta temperatura. Até descobrir isso, foi o cão. Mas descobri, ressoldei e tudo voltou ao normal. Mas nisso meu Windows, de tanto desliga/liga/desliga/liga, acabou se ferrando. Pra piorar meu HD de 80GB está cheia até a tampinha. Tive até que desinstalar algumas coisas. E como eu não posso parar pra formatar (um HD novo, maior) por conta do trabalho que venho fazendo, o jeito é ir trabalhando meio limitado em algumas coisas que, felizmente, não são tão prioritárias.

Espero que, quando outubro chegar, eu já esteja de máquina nova e mais tranqüilo com o serviço. Aí tudo deverá voltar ao eixo normal. :)

Enviado: 13 Set 2007 22:14
por Pablo César
Puxa... e 80GB cheinho ? mio Dio nem quero pensar... só de pensar ja dá alergia. Pensar que muitas vezes acabamos apagando coisas importantes e ás vezes outras que deixamos em duplicidade...

Segue outro exemplo mas para WINXP. Testei e criou um ícone no Menú iniciar/Programas mas no desktop não conseguí mas acho que isso não é problema. aqui vai o outro:

Criar um arquivo TESTE2.BAT com o seguinte conteúdo:

Código: Selecionar todos

LINKXP C:\WINDOWS\NOTEPAD.EXE C:\DOCUME~1\PABLO\DESKTOP C:\WINDOWS\SYSTEM32\CONFIG\SYSTEM~1\MENUIN~1\PROGRA~1 ICONE
Depois criar o outro arquivo em lote chamado LINKXP.BAT com o seguinte conteúdo:

Código: Selecionar todos

@echo off & setlocal
::For Windows NT 4.0 users only!!!
::Creates LNK and PIF files from the command line.
::Author: Walter Zackery
if not %1[==[ if exist %1 goto start
echo You must pass the path of a file or folder to the
echo batch file as a shortcut target.
if not %1[==[ echo %1 is not an existing file or folder
(pause & endlocal & goto:eof)
:start
(set hkey=HKEY_CURRENT_USER\Software\Microsoft\Windows)
(set hkey=%hkey%\CurrentVersion\Explorer\Shell Folders)
(set inf=rundll32 setupapi,InstallHinfSection DefaultInstall)
start/w regedit /e %temp%\#57#.tmp "%hkey%"

for /f "tokens=*" %%? in (
'dir/b/a %1? 2^>nul') do (set name=%%~nx?)

for /f "tokens=2* delims==" %%? in (
'findstr/b /i """desktop"""= %temp%\#57#.tmp') do (set d=%%?)

for /f "tokens=2* delims==" %%? in (
'findstr/b /i """programas"""= %temp%\#57#.tmp') do (set p=%%?)

(set d=%d:\\=\%) & (set p=%p:\\=\%)
if not %2[==[ if exist %~fs2\nul (set d=%~fs2)
if not %2[==[ if exist %~fs2nul (set d=%~fs2)
set x=if exist %2\nul
if not %2[==[ if not %d%==%2 %x% if "%~p2"=="\" set d=%2
echo %d%|find ":\" >nul||(set d=%d%\)
(set file=""""""%1"""""")
for /f "tokens=1 delims=:" %%? in ("%file:"=%") do set drive=%%?
(set progman=setup.ini, progman.groups,,)
echo > %temp%\#k#.inf [version]
echo >>%temp%\#k#.inf signature=$chicago$
echo >>%temp%\#k#.inf [DefaultInstall]
echo >>%temp%\#k#.inf UpdateInis=Addlink
echo >>%temp%\#k#.inf [Addlink]
echo >>%temp%\#k#.inf %progman% ""group200="}new{"""
echo >>%temp%\#k#.inf setup.ini, group200,, """%name%"",%file%
start/w %inf% 132 %temp%\#k#.inf
del %temp%\#k#.inf %temp%\#57#.tmp
move %p%\"}new{\*.*" %d% >nul 2>&1
rd %p%\}new{ 2>nul
move %p%\}new{.lnk %d%\"drive %drive%.lnk" >nul 2>&1
endlocal
Espero que tenham gostado.

Enviado: 13 Set 2007 22:42
por Maligno
só de pensar ja dá alergia.
Só no backup das coisas mais importantes eu gastava 5 DVDs. Mas isso foi há meses. :)
Espero que tenham gostado.
Não testei mas gostei. Parabéns pelo trabalho. Mas por essas que a gente vê como um simples batch pode ficar até bem complexo. E macarrônico. :)))

Enviado: 14 Set 2007 09:04
por Pablo César
Maligno escreveu:Parabéns pelo trabalho.
Obrigado, mas o crédito todo é do autor "Walter Zackery" embora o procedimento se realize em comandos do DOS em arquivo de lote, não tira crédito algum pois é de uma geniosidade incrível. Aliás tenho muita aptidão para uso de BATCHs e foi assim que descobrí esta rotina.
Mas por essas que a gente vê como um simples batch pode ficar até bem complexo. E macarrônico.
Sim... macarrônico (hihi), mas muito funcional e criativo no entanto tudo isso poderia ser consideravelmente reduzido ao utilizar as funções da WAPI e a criação do arquivo .INF pelo MEMOWRIT.

As funções da WAPI que envolveria nesse processo, seriam:

-GETWININFO()
-GETSYSINFO()
-THISPATH()
-MAKEPATH()
-WAPITMPDIR() - Se bem que você desaconselha o uso direto, será que pode ?

E para finalizar, executar as DLLs (SETUPX do WIN98 e SETUPAPI do XP). Caberia saber se é possível executar de dentro da WAPI tais DLLs, teria como ?. Seria pelo RUN ou SWPRUNCMD ? Ou teria uma forma de acionamento direto às DLLs ?

Enviado: 14 Set 2007 09:29
por Maligno
Caberia saber se é possível executar de dentro da WAPI tais DLLs, teria como ?
Claro. Não sei se você já chegou a ver o fonte WAPI.C, mas nele mesmo já utilizei a carga da SHFOLDER.DLL na função GetWinSysInfo().

Enviado: 14 Set 2007 09:36
por Pablo César
Ahhh sim, não tinha percebido esse ponto. Se bem que SEMPRE estou lendo e intentando entender seu código-fonte em C.
// Apesar de estar na condição de obsoleta, preferi utilizar SHFOLDER.DLL, ao invés de
// SHELL32.DLL, pois esta última não contém a função SHGetFolderPath() em sistemas com
// Windows 98, ao passo que a primeira DLL também existe nas versões NT para efeito de
// compatibilidade.
//
HMODULE hDLL = LoadLibrary("SHFOLDER.DLL")
Esta medida foi mudada ou está desde o começo da criação da função GetWinSysInfo() ?. Não tinha notado, passou por alto. Mas enfim, isso irá dar mais dinamismo. Se bem que você "carrega" a DLL mas para executar seria outra função, não é mesmo ?

Enviado: 14 Set 2007 09:46
por Maligno
Esta medida foi mudada ou está desde o começo da criação da função GetWinSysInfo() ?
Sempre esteve lá, desde a liberação da função.
Se bem que você "carrega" a DLL mas para executar seria outra função, não é mesmo ?
Sim, a carga da DLL é um procedimento à parte. Pra poder executar alguma função, tenho que descobrir o ponteiro dela e então executá-la por meio dele.

Enviado: 14 Set 2007 10:22
por Pablo César
a carga da DLL é um procedimento à parte. Pra poder executar alguma função, tenho que descobrir o ponteiro dela e então executá-la por meio dele.
Puxa, como é complexo !. Espero que seja fácil. Pensei que seria chamar pelo nome da função.

Estive fazendo outros testes com a LINK98.BAT e coloquei em lugar do NOTEPAD.EXE o meu sistema que é chamado por um .BAT e após de disponibilizar o ícone no DESKTOP notei que faltaria asignar alguns parâmetros como:

- Fechar sessão ao sair.
- Tela Inteira/Janelado
- Asignar o arquivo .ICO para alterar o ícone que irá aparecer na áera de trabalho

Fora que tais propriedades (do atalho) difere de WIN98 para XP. Será que vai ser possível asignar isso na nova função da WAPI para criação do atalho ?

Enviado: 14 Set 2007 10:28
por Maligno
Pablo César escreveu:Puxa, como é complexo !. Espero que seja fácil. Pensei que seria chamar pelo nome da função.
Esqueci: antes de chamar a função, tenho que montar o protótipo dela, pro compilador saber como trabalhar com ela. Mas não é tão complexo assim. É só seguir os procedimentos.
Fora que tais propriedades (do atalho) difere de WIN98 para XP. Será que vai ser possível asignar isso na nova função da WAPI para criação do atalho ?
O WAPI.C já conta, desde o começo, com a função IsWindowsNT(), que me quebra esse galho. :)

Enviado: 14 Set 2007 10:35
por Pablo César
Maligno escreveu:O WAPI.C já conta, desde o começo, com a função IsWindowsNT()
Ahh não me referia a detecção tão apenas da versão do SO e sim das diferenças (quantidade e tipo) das propriedades dentro do atalho entre as diferentes versões SO. Imaginando que você iria fazer uso da criação do arquivo .INF para gerar o atalho.

Enviado: 14 Set 2007 10:39
por Maligno
diferenças (quantidade e tipo) das propriedades dentro do atalho entre as diferentes versões SO
Agora entendi. Mas a resposta é não. E nem poderia ser outra, já que nunca nem passei perto disso. Portanto, respondo agora corretamente à sua pergunta:
Fora que tais propriedades (do atalho) difere de WIN98 para XP. Será que vai ser possível asignar isso na nova função da WAPI para criação do atalho ?
Claro. :)

Enviado: 14 Set 2007 10:56
por Pablo César
Beleza então. Quê bom contarmos com o acesso de APIs do Windows em Clipper. Não vejo a hora de ver seu TODO LIST finalizado. Por falar disso, seria bom recapitular e exibir novamente seu TODO LIST da WAPI, pois parece que foram adicionados vários itens desde a ultima vez que foi publicada.