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

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

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

Mensagem 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.
Editado pela última vez por Pablo César em 13 Set 2007 21:29, em um total de 1 vez.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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 !.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)))
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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 ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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().
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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 ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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 ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder