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