Página 1 de 1
Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 13:29
por marcos.gurupi
Caros, quero salvar um arq. (XML compactado da NFe) na area de atrabalho do cliente, para ficar mais facil o envio por email. Eu lembro que vi isso uma vez na hwgui. Alguem sabe qual eh o comando para pegar o endereco da area de trabalho atual do usuario?
Marcos Roberto.
Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 13:54
por Pablo César
Em HMG é GetDesktopFolder(), mas eu fosse você criaria um Hiperlink que clicando chame o Outlook.
Re: Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 14:01
por Toledo
Marcos, tenta o seguinte:
Código: Selecionar todos
Func Main()
? GetEnv( "USERPROFILE" )+"\Desktop"
Return Nil
Abraços,
Re: Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 14:02
por marcos.gurupi
Obrigado Pablo Cesar pela resposta. Mas aqui estah ocorrendo um erro na funcao q vc me passou. Tenho q linkar qual lib para funcionar ?
Marcos Roberto.
Re: Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 14:09
por Toledo
Marcos, a função que o Pablo passou é da MiniGui, então não vai funcionar com a HwGui.
Re: Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 14:12
por marcos.gurupi
Toledo tentei implementar a sua e nao consegui. A sua funcao eh em xhb 1.0.0?
Marcos Roberto.
Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 14:24
por Pablo César
Oi MArcos, desculpe se confundí você. Eu apenas mencionei a função em HMG pensando que em HwGUI poderia ser a mesma. E$u procurei na internet e não achei ao equivalente, talvez em Harbour mesmo. Quanto a função do Toledo a função GetEnv é da propria linguagem, até no Clipper temos essa função que nada mais é a leitura da variável "USERPROFILE" do proprio ambiente operacional. Se for dar um SET USERPROFILE na linha de comando no WINXP ele irá retornar o nome da pasta do usuário e o "Desktop" que o Toledo adicionou é o equivalente a área de trabalho. Portanto deveria funcionar ao menos em Windows Xp, ja no WIN98 sabemos que normalmente é "C:\WINDOWS\DESKTOP". Por isso tem que se certificar primeiro qual é a versão do Windows. Se for Xp é só colocar o resultado numa variável com a indicação do Toledo:
cVar := GetEnv( "USERPROFILE" )+"\Desktop"
Re: Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 14:26
por Toledo
Marcos, a função GetEnv() é do Clipper, então deve funcionar em qualquer versão do xHarbour/Harbour. Mas note que estou buscando o conteúdo da variável de ambiente USERPROFILE, que existe no Windows XP e Vista. Agora nas outras versões do Windows, eu não sei se existe tal variável.
A Área de Trabalho corresponde a uma pasta chamada Desktop dentro da pasta do usuário atual, então o que eu fiz foi verificar através de comando SET qual variável teria esta pasta do usuário, encontrei então USERPROFILE.
Faça um teste, entre no prompt do DOS e digite SET e pressione Enter. Vai aparecer várias variáveis de ambiente, procure uma delas que contenha a pasta do usuário atual.
Obs.: como esta variável pode mudar de uma versão para outra do Windows, você teria que verificar qual a versão instalada. No xHarbour existe funções para isto, dê uma olhada em: Os_VersionInfo().
Abraços,
Re: Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 22:04
por Toledo
Marcos, faça um teste com este código:
Código: Selecionar todos
Func Main()
RetDesktop:=GETSPECIALFOLDER(0x0010)
? RetDesktop
Return Nil
*---------------------------------------------------------------*
Function GETSPECIALFOLDER(nCSIDL) // Contributed By Ryszard Rylko
*---------------------------------------------------------------*
RETURN C_getspecialfolder(nCSIDL)
#pragma BEGINDUMP
#include <windows.h>
#include <shlobj.h>
#include "hbapi.h"
#include "hbapiitm.h"
HB_FUNC( C_GETSPECIALFOLDER ) // Contributed By Ryszard RyRko
{
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
Abraços,
Pegar o endereco da area de trabalho
Enviado: 02 Fev 2011 23:41
por Pablo César
Pelo que estive pesquisando, esse código só servirá para NT based. Isto é, para Win98 não serve. Para manter a compatibilidade entre versões, o WAPI.C do Maligno possui esta função em que utiliza a SHFOLDER.DLL, veja parte do código:
Código: Selecionar todos
/*
* WAPI.C (funções da API do Windows para DOS)
* -------------------------------------------
* Abril/2007, Paulo Buzinello
* Home: http://www.buzinello.com/prg
* paulo@buzinello.com
* Londrina/PR
* Brasil
* -------------------------------------------
* Licença de uso:
* A utilização deste software e da biblioteca
* que o acompanha é totalmente livre e grátis
* em quaisquer circunstâncias. Sinta-se livre
* para promover modificações no todo ou parte
* dos fontes, da maneira que quiser. Sinta-se
* livre também para distribuir este software,
* desde que integral e gratuitamente, e dando
* os devidos créditos ao autor original e aos
* autores das modificações subseqüentes.
* -------------------------------------------
* Responsabilidade:
* O autor se isenta integralmente de qualquer
* responsabilidade sobre prejuízos que possam
* ser causados pelo mau uso e mesmo por algum
* possível erro de programação ou de projeto.
* -------------------------------------------
*
* Compilador GCC:
* gcc wapi.c -s -c -Os
* gcc wapi.o -s -mwindows -mconsole -l wininet -l winspool -l winmm -owapi.exe
* -----------------------------------------------------------------------------------------------------*/
// 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");
if (hDLL) {
typedef HRESULT (WINAPI*(Fct))(HWND,int,HANDLE,DWORD,LPSTR);
Fct SHF = (Fct)GetProcAddress(hDLL,"SHGetFolderPathA");
if (SHF) {
if (SUCCEEDED(SHF(NULL,CSIDL_PROGRAM_FILES,NULL,0,Buffer))) {
fprintf(ResultFileHandle,"%s,",Buffer);
GetShortPathName(Buffer,Buffer,_kBUFFER_SIZE);
fprintf(ResultFileHandle,"%s,",strlwr(Buffer));
}
else fprintf(ResultFileHandle,",,");
if (SUCCEEDED(SHF(NULL,CSIDL_DESKTOPDIRECTORY,NULL,0,Buffer))) {
fprintf(ResultFileHandle,"%s,",Buffer);
GetShortPathName(Buffer,Buffer,_kBUFFER_SIZE);
fprintf(ResultFileHandle,"%s,",strlwr(Buffer));
}
else fprintf(ResultFileHandle,",,");
if (SUCCEEDED(SHF(NULL,CSIDL_COMMON_DESKTOPDIRECTORY,NULL,0,Buffer))) {
fprintf(ResultFileHandle,"%s,",Buffer);
GetShortPathName(Buffer,Buffer,_kBUFFER_SIZE);
fprintf(ResultFileHandle,"%s,",strlwr(Buffer));
}
else fprintf(ResultFileHandle,",,");
if (SUCCEEDED(SHF(NULL,CSIDL_PERSONAL,NULL,0,Buffer))) {
fprintf(ResultFileHandle,"%s,",Buffer);
GetShortPathName(Buffer,Buffer,_kBUFFER_SIZE);
fprintf(ResultFileHandle,"%s" ,strlwr(Buffer));
}
else fprintf(ResultFileHandle,",");
}
FreeLibrary(hDLL);
}
Outro jeito seria executar o WAPI.EXE -GETSYSTEMINFO:<resultFile> e ler o arquivo dentro do sistema. Sei que soa um tanto gambiarristico, mas também funciona.
Re: Pegar o endereco da area de trabalho
Enviado: 09 Fev 2011 18:22
por esbasso
Código: Selecionar todos
Function GetDesktopFolder()
local objShell, GetDesktopFolder
objShell := CreateObject("WScript.Shell")
GetDesktopFolder := objShell:SpecialFolders:Item("Desktop")
objShell := nil
msginfo(GetDesktopFolder)
RETURN GetDesktopFolder
Re: Pegar o endereco da area de trabalho
Enviado: 11 Fev 2011 14:00
por marcos.gurupi
Caro luis eh isso mesmo. Obrigado.
Marcos Roberto.
Pegar o endereco da area de trabalho
Enviado: 15 Ago 2011 16:30
por Adalberto
Olá Marco
Estou procurando a mesma solução que você conseguiu em fev 2011, agora eu te pergunto, da colaboração de Luis-para ele um agradecimento especial pela sua valiosa colaboração-, se a área de trabalha não for DeskTop então a função não e automática não? Tem que trocar no código fonte a palavra DeskTop por Escritorio (como em espanhol, por exemplo).
Daí que eu escolhi a proposta do Toledo, não testei em Win98 porque em Bolivia já casi ninguém têm essa versão de Windows, ainda o XP já vai de saída, estão mudando para Win7.
Por favor me comentas este tema, tenho interesse de saber o mais possível para complementar uma função de criação de atalho bem funcional, já esta quase pronta, só falta esse tema de encontrar o caminho certo da área de trabalho.
Fico aguardando tuas noticias,
Muito obrigado com todos os amigos que tanta gentileza e um coração de ouro colaboram conosco.
Um grande abraço, Adalberto
Pegar o endereco da area de trabalho
Enviado: 15 Ago 2011 17:10
por Adalberto
Marco
Já fiz os testes do função de Luis, funciona certinho, com nomes curtos, encontra o “Escritorio” em espanhol e DeskTop em Inglês.
Muito obrigado, Deus abençoe você e teus queridos.
Adalberto