GETENV não está lendo variável

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

GETENV não está lendo variável

Mensagem por rubens »

Bom dia...

Estou tentando ler uma variável com o GETENV() mas está retornando vazio. O que estou fazendo de errado?

Seto a variável
SETDIRORC.png
SETDIRORC.png (9.62 KiB) Exibido 4176 vezes
Quando executo o programa e executo GETENV('DIRORC') retorna vazio
GETENV.png
Eu executo o programa logo após definir o set dirorc=d:\orcame\
Já tentei também criar um bat e setar a variável e executar o programa
Quando busco qualquer variável do sistema tipo GETENV('PATH') funciona.

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

GETENV não está lendo variável

Mensagem por Jairo Maia »

Olá Rubens,

Isso é porque seu sistema está rodando em instância diferente da instância que foi definida a variável de ambiente DIRORC.

Por exemplo: Se você sair para o prompt do DOS e compilar o exemplo abaixo, em seguida setar a variável DIRORC, e rodar o exemplo ela retornará correta, pois o exemplo foi rodado na mesma instância que foi definida a variável.

O mesmo problema ocorre quando você usa o .BAT, pois o BAT abre uma nova instância para ser executado. E curiosidade, não resolve se usar: Hb_Run( "SET DIRORC=D:\ORCAME" ), já que o HB_Run() também abre outra instância para executar o comando.

Código: Selecionar todos

Function Main()

 Hb_Alert( GetEnv( "DIRORC" ) )
 
Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GETENV não está lendo variável

Mensagem por asimoes »

Olá,

Setar variável de ambiente em tempo de execução

Código: Selecionar todos

SetEnvironmentVariable("TESTE", "BRAZILIAN PORTUGUESE_BRAZIL.WE8PC850")
cTeste:=hb_GetEnv("TESTE")
#pragma BEGINDUMP
#include <windows.h>
#include <shlobj.h>
#include <math.h>
#include "hbapi.h"
#include "hbvm.h"
#include "hbstack.h"
#include "hbapiitm.h"

HB_FUNC( SETENVIRONMENTVARIABLE )
{
   hb_retl( SetEnvironmentVariableA( (LPCSTR) hb_parcx( 1 ),
                                     (LPCSTR) hb_parcx( 2 )
                                     ) ) ;
}
#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

GETENV não está lendo variável

Mensagem por asimoes »

Pegar todas as variáveis de ambiente do sistema


Código: Selecionar todos

aEnv := hb_ATokens( EnvParam(), hb_Eol() )

#pragma BEGINDUMP

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <hbapi.h>

char * LToStr( long );

HB_FUNC( ENVPARAM )
{
    LPTSTR lpszVariable;
    LPTCH lpvEnv;
    char * pszBuffer = NULL;
    int iLastLen = 0;
   
    // Get a pointer to the environment block.
    lpvEnv = GetEnvironmentStrings();

    // If the returned pointer is NULL, exit.
    if (lpvEnv == NULL)
    {
        printf("GetEnvironmentStrings failed (%d)\n", GetLastError());
        return ;
    }

    // Variable strings are separated by NULL byte, and the block is
    // terminated by a NULL byte.
    lpszVariable = (LPTSTR) lpvEnv;

    while (*lpszVariable)
    {
          char * newBuffer;
          int iLen = lstrlen( lpszVariable );
        pszBuffer = hb_xrealloc( pszBuffer, iLastLen + iLen + 2 );        
        hb_xmemcpy( pszBuffer+iLastLen, lpszVariable, iLen );
        hb_xmemcpy( pszBuffer+iLastLen+iLen, "\r\n", 2 );
        iLastLen += iLen + 2;        
        lpszVariable += lstrlen(lpszVariable) + 1;
       
    }
    FreeEnvironmentStrings(lpvEnv);
   
    hb_retc( pszBuffer );
}

#pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

GETENV não está lendo variável

Mensagem por JoséQuintas »

Já disseram, em todo caso:

Está criando a variável de ambiente na janela do prompt atual.
Seu programa está sendo executado na janela do prompt atual?
d:\temp>copy con test.prg
? getenv( "TEST" )
Substituir test.prg? (Sim/Não/Todos): s
^Z
1 arquivo(s) copiado(s).

d:\temp>hbmk2 test
hbmk2: Processing environment options: -comp=msvc
Harbour 3.4.0dev (34b404d) (2016-05-30 12:33)
Copyright (c) 1999-2016, https://github.com/vszakats/harbour-core/
Compiling 'test.prg'...
Lines 1, Functions/Procedures 1
Generating C source output to 'C:\Users\joseq\AppData\Local\Temp\hbmk_7lfk3t.dir\test.c'... Done.
test.c

d:\temp>test


d:\temp>SET TEST=XXXX

d:\temp>test

XXXX
d:\temp>
Nota: lembre-se que mesmo em outra janela de prompt ela não vai aparecer, muito menos em janela Windows.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
syslink
Usuário Nível 3
Usuário Nível 3
Mensagens: 132
Registrado em: 20 Fev 2018 13:13
Localização: joinvile/sc

GETENV não está lendo variável

Mensagem por syslink »

asimoes escreveu:Pegar todas as variáveis de ambiente do sistema
uauuuu
asimoes escreveu:Setar variável de ambiente em tempo de execução
esse foi fera... agora q descobri por acaso ao pesquisar sobre getenv...
isso funciona so no autoexec.bat .nt ou da pra fazer tbm nas variaveis de ambiente do windows (vista/7/810)
Responder