Pegar o endereco da area de trabalho

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Pegar o endereco da area de trabalho

Mensagem 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.
Marcos Roberto
NetService Software
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á

Pegar o endereco da area de trabalho

Mensagem por Pablo César »

Em HMG é GetDesktopFolder(), mas eu fosse você criaria um Hiperlink que clicando chame o Outlook.
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
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Pegar o endereco da area de trabalho

Mensagem por Toledo »

Marcos, tenta o seguinte:

Código: Selecionar todos

Func Main()
? GetEnv( "USERPROFILE" )+"\Desktop"
Return Nil
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Pegar o endereco da area de trabalho

Mensagem 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.
Marcos Roberto
NetService Software
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Pegar o endereco da area de trabalho

Mensagem por Toledo »

Marcos, a função que o Pablo passou é da MiniGui, então não vai funcionar com a HwGui.
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Pegar o endereco da area de trabalho

Mensagem por marcos.gurupi »

Toledo tentei implementar a sua e nao consegui. A sua funcao eh em xhb 1.0.0?

Marcos Roberto.
Marcos Roberto
NetService Software
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á

Pegar o endereco da area de trabalho

Mensagem 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"
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
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Pegar o endereco da area de trabalho

Mensagem 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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Pegar o endereco da area de trabalho

Mensagem 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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
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á

Pegar o endereco da area de trabalho

Mensagem 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.
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.
esbasso
Colaborador
Colaborador
Mensagens: 325
Registrado em: 24 Jan 2007 17:49
Localização: CHAPECO/SC

Re: Pegar o endereco da area de trabalho

Mensagem 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
Editado pela última vez por Toledo em 09 Fev 2011 19:22, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Luis Fernando Basso
Desenvolvedor VFP + XHARBOUR + HWGUI
lfbasso@gmail.com
http://www.engersoft.com.br
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Pegar o endereco da area de trabalho

Mensagem por marcos.gurupi »

Caro luis eh isso mesmo. Obrigado.

Marcos Roberto.
Marcos Roberto
NetService Software
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Pegar o endereco da area de trabalho

Mensagem 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
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Pegar o endereco da area de trabalho

Mensagem 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
Responder