Olá Abel,
Eu passei por isso quando migrei meus aplicativos de CLIPPER para xHarbour, e geralmente os usuários criavam um atalho com um nome do próprio EXE ou com nome de SISTEMA, então eu fiz o sistema quando entrar verificar se tinha o novo atalho na Área de trabalho do usuário e procurar pelos antigos nomes e excluir. Claro que tive que abrir mão do antigo nome que se usava no atalho apenas o nome do EXE mantive o mesmo, mudança pequena como colocar um PONTO no final do nome para diferenciar o atalho novo do velho.
Veja como usava chamando apenas função: CRIAR_ATALHO_NOVO() , na próxima vez que ele entrar no sistema já estava com o ícone novo. Se esqueci de algo me fale...
***************************
FUNCTION CRIAR_ATALHO_NOVO
***************************
Local aShortCut, oWSHShell
Local cPATH_DESKTOP:=GETENV('HOMEDRIVE')+GETENV('HOMEPATH')+'\Desktop'
Local aATALHOS1 := cPATH_DESKTOP+'\*.lnk" // todos os atalhos da area de trabalho
Local aATALHOS2 := Directory(aATALHOS1), nI
Local lREINICIA:=.F.
FOR nI = 1 TO LEN(aATALHOS2)
IF UPPER(aATALHOS2[nI,1])='SISTEMA.LNK' // aqui vai todos os nomes provaveis do antigo icone
Ferase(cPATH_DESKTOP+'\'+aATALHOS2[nI,1])
lREINICIA:=.T.
ENDIF
NEXT
IF FILE(cPATH_DESKTOP+'\Novo_sistema.lnk') // se já existe o nome nem precisa fazer nada
RETURN .T.
ENDIF
IF !MsgYesNo('Não foi localizado o Icone na area de Trabalho para o Sistema, Deseja Criar Agora ?')
RETURN .F.
ELSE
lREINICIA:=.T.
ENDIF
TRY
oWSHShell:= CreateObject("WScript.Shell")
CATCH error
ShowMsg('Não foi possivel criar o icone na area de trabalho, Favor revisar')
RETURN .F.
END
IF IsDirectory(cPATH_DESKTOP) = .F.
Release oWSHShell
ShowMsg('Não foi possivel criar o icone na area de trabalho, Favor revisar')
RETURN .F.
ENDIF
aShortCut:= oWSHShell:CreateShortcut(cPATH_DESKTOP+'\Novo_sistema.lnk')
aShortCut:TargetPath := CAMINHO_EXE()+'\'+ Nomeexecutavel() //GETENV("HOMEDRIVE")+GETENV("HOMEPATH")+"\Desktop"
aShortCut:WorkingDirectory := CAMINHO_EXE()+'\'
//aShortCut:IconLocation := "Z:\"+ Nomeexecutavel() //icone do sistema
aShortCut:Save()
Release oWSHShell
IF !FILE(cPATH_DESKTOP+'\Novo_sistema.lnk')
ShowMsg('Não foi possivel criar o icone na area de trabalho, Favor revisar')
Return .F.
ENDIF
IF lREINICIA
MYRUN(Nomeexecutavel()) // ABRE O SISTEMA NOVAMENTE APARTIR DO EXE E NÃO PELO ATALHO
QUIT // AQUI FECHA O APLICATIVO ATUAL
ENDIF
Return .T.
********************************************************************************
***********VEREFICA O NOME DO EXECUTAVEL E O CAMINHO DO MESMO*******************
*NomeExecutavel() // verefica o nome
*NomeExecutavel(.t.) // verefica o caminho
********************************************************************************
FUNCTION NOMEEXECUTAVEL(lPath)
LOCAL nPos, cRet
If Empty(lpath)
nPos:= RAT("\", hb_argv(0))
cRet:= substr(hb_argv(0), nPos+1)
else
cRet:= hb_argv(0)
endif
Return cRet
********************
*Retorna o caminho do EXE
FUNCTION CAMINHO_EXE
Return(Substr(Nomeexecutavel(.t.),1,(len(Nomeexecutavel(.t.))- len(Nomeexecutavel()))-1 ))