-
Posts
1,291 -
Joined
-
Last visited
-
Days Won
35
Posts posted by oribeiro
-
-
Pessoal,
Para aumentar a segurança do sistema dentro do Terminal Server, eu criei uma rotina para abrir uma tela de explorador de arquivos onde o usuário não consegue apagar os arquivos, mas apenas selecioná-los:
function xGetFiles( cMask, cTitle, nDefaultMask, cInitDir, lNova ) // Permite a seleção de múltiplos arquivos #define OFN_PATHMUSTEXIST 0x00000800 #define OFN_NOCHANGEDIR 0x00000008 #define OFN_ALLOWMULTISELECT 0x00000200 #define OFN_EXPLORER 0x00080000 // new look commdlg #define OFN_LONGNAMES 0x00200000 // force long names for 3.x modules #define OFN_ENABLESIZING 0x00800000 Local cSelect, cPath, cAux, cAux1, nAt, nFlags, lSave:=.F., aFiles := {} Default cMask := "Todos (*.*)|*.*|" Default cTitle := "Selecione o arquivo" Default nDefaultMask := 1 Default cInitDir := "" Default lNova := .F. cInitDir:= iif(Empty(cInitDir), PastaTxt(), cInitDir) if lNova // Tela nova do Windows (mas permite que o usuário apague arquivos) nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_EXPLORER, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON ) MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) }) if Len( aFiles ) > 1 for nAt := 2 to Len( aFiles ) aFiles[ nAt ] := aFiles[ 1 ] + "\" + aFiles[ nAt ] next ADel( aFiles, 1 ) ASize( aFiles, Len( aFiles ) - 1 ) endif else // Tela Antiga que limita o usuário. nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON ) MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) }) if "\ "$aFiles[1] // Se selecionou múltiplos arquivos cSelect := aFiles[1] aFiles := {} cPath := Left(cSelect, RAT("\", cSelect)) // Caminho cSelect := Alltrim(Subst(cSelect, Len(cPath)+1, Len(cSelect))) Do While "."$cSelect cAux := Left(cSelect, AT(".",cSelect)) // Nome do Arquivo cSelect := Alltrim(Subst(cSelect, Len(cAux )+1, Len(cSelect))) if " "$cSelect cAux1 := Left(cSelect, AT(" ",cSelect)) // Extenção do Arquivo cSelect:= Alltrim(Subst(cSelect, Len(cAux1)+1, Len(cSelect))) else cAux1 := cSelect cSelect:= "" endif AAdd(aFiles, cPath+Alltrim(cAux)+AllTrim(cAux1)) EndDo endif endif return( aFiles )
Agora eu preciso que os arquivos que o usuário selecionou sejam colocados na área de transferência (Ctrl+C) mas não estou conseguindo, alguém pode me ajudar?
aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. ) oClp:=TClipboard():New() oClp:Clear() for i=1 to len(aFiles) oClp:SetText( aFiles[1] ) next oClp:End()
Tentei assim, mas também os arquivos não foram para a área de transferência:
aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. ) OpenClipboard( GetDesktopWindow() ) for i=1 to len(aFiles) SetClipboardData( 1, aFiles[i] ) next CloseClipboard()
-
-
Esta incompleto.
A chave está na função em C# que postei no início desse tópico.
Se alguém que entende de C# puder criar uma função igual no xHarbour o problema estará resolvido.
-
João,
Li todas as suas referências mas tá difícil! Risos
Ainda não cheguei no Hash de 28 caracteres que o SEFAZ exige.
-
João,
Esses valores do exemplo que passei dão certo no SEFAZ. Só não sei como calcular o hash de 28 posições que é calculado por aquele programa em C#.
-
Estou tentando fazer isso:
Passos necessários para geração do "hashCSRT" :
1) Concatenar o CSRT com a chave de acesso da NF-e/NFC-e que está sendo emitida.
CSRT: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO
Chave de Acesso: 41180678393592000146558900000006041028190697
Concatenada: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO41180678393592000146558900000006041028190697
2) Aplicar o algoritmo SHA-1 sobre o resultado da concatenação do passo 1, resultando em um string de 20 bytes hexadecimais.
Resultado: 696bfa2de10ce17eaee3ea8123639867c82b8a0c
3) Converter o resultado do passo anterior para Base64, resultando em uma string de 28 caracteres;
Resultado: aWv6LeEM4X6u4+qBI2OYZ8grigw=
4) Montar o grupo de identificação da empresa desenvolvedora do software (tag: infRespTec), com a tag "idCSRT" o identificador do CSRT utilizado para a geração do hash e a tag "hashCSRT" o resultado do passo 3.
Resultado:
Fonte: NT2018_005_v1_20
-
Bom dia João,
Obrigado pelo seu interesse em ajudar.
Deixa eu explicar o meu objetivo com esse algorítmo em C# :
Estou planejando as mudanças que virão na NF-e com a inclusão dos dados do desenvolvedor.
A primeira parte da conversão eu consegui com o comando: hb_sha1( codigo_exemplo ) que funciona perfeitamente e me retorna a chave "696bfa2de10ce17eaee3ea8123639867c82b8a0c" depois disso eu preciso converter essa chave para Base64 mas o problema é que o comando HB_Base64encode( "696bfa2de10ce17eaee3ea8123639867c82b8a0c" ) retorna "Njk2YmZhMmRlMTBjZTE3ZWFlZTNlYTgxMjM2Mzk4NjdjODJiOGEwYw==" e eu preciso que retorne "aWv6LeEM4X6u4+qBI2OYZ8grigw=".
Achei num fórum esse algoritmo em C# que pega o resultado do HB_Base64encode() e gera o código que eu preciso, mas não estou conseguindo fazer essa rotina em xHarbour.
Você conhece alguma função que faça isso?
-
Pessoal,
Alguém, por favor, consegue converter essa função C para uso no xHarbour?
private static string ToBase64Hex(string value) { int countChars = value.Length; byte[] bytes = new byte[countChars / 2]; for(int i = 0; i < countChars; i+=2) { bytes[i / 2] = Convert.ToByte(value.Substring(i, 2), 16); } return Convert.ToBase64String(bytes); }
-
-
Tranquilo Motta.
Obrigado mesmo assim.
Vou tentar de outra forma.
-
Coloquei no meu servidor Windows Server 2008 R2 e funcionou perfeitamente.
Daí eu coloquei o executável no servidor do meu cliente que é a mesma versão do Windows e deu o seguinte erro:
Erro irrecuperável 9003:
Muitas chamadas recursivas ao manipulador de erros.
-
Valeu Motta,
Mas como eu faço a chamada somente da função ExitWindowsEx para fazer apenas o LogOff?
-
Pessoal,
Quero dar um LogOff no usuário do terminal server assim que ele fechar o sistema.
Tem como fazer isso?
-
Eu trabalho com ACBrNfeMonitor.exe executando em segundo plano.
Existe uma forma de trabalhar com ACBr através de LIB ?
-
-
Obrigado.
-
Pessoal,
Existe algum comando que me retorna o mome do arquivo em vez de o Alias?
Exemplo:
USE CLIENTES ALIAS CLI
? Alias() // Retorna: CLI
? Dbf() // Retorna: CLI
Preciso de um comando que retorne: CLIENTES
-
Pessoal,
Estou trabalhando com arquivos temporários em memória com o hb_dbcreate() assim:
///////////////////////////////////////////////// // Arquivo Temporário, no xHarbour 1.2 Somente // // Cria o Arquivo na memória (não usa o Disco) // ///////////////////////////////////////////////// Local _DbfTemp[1]:="ARQTEMP" Hb_DbCreate(_DbfTemp[1],{{ "Nombre", "C", 40, 0 },; // -> Criação do Memory File Temporary com Hb_DbCreateTemp() { "Direccion", "C", 50, 0 },; { "Telefono", "C", 12, 0 },; { "Edad", "N", 2, 0 },; { "Productos", "C", 10, 0 },; { "Nivel", "N", 2, 0 }}) // Seleciona o Arquivo criado na memória e usa os comandos comuns de tratamento dos registros // Select(_DbfTemp[1]) OADbAppend() replace nombre with "Oscar Ribeiro" replace Direccion with "RUA MARCIA PIERRONI, 99" replace Telefono with "55 11 4025-1234" DbAppend() replace nombre with "Marco Ribeiro" replace Direccion with "RUA MARCIA PIERRONI, 99" replace Telefono with "55 11 4025-1234" DbAppend() replace nombre with "Oscar Ribeiro Neto" replace Direccion with "RUA MARCIA PIERRONI, 99" replace Telefono with "55 11 4025-1234" browse() // Cria o indice do arquivo também na memória // index on nombre to clientes Memory Seek "Marco Ribeiro" browse() // Fecha o arquivo e Apaga da Memória // (_DbfTemp[1])->(DBCLOSEAREA()) oaDbDrop("MEM:"+_DbfTemp[1])
Entendi que quando fecho o arquivo com DbCloseArea() o arquivo ainda continua na memória, porque eu consigo abrí-lo novamente com DbUseArea() mas preciso saber se existe algum comando que verifica se o arquivo ainda está lá.
Por exemplo, se o arquivo é físico eu uso FILE("ARQTEMP.DBF"), mas com arquivo de memória, existe algum comando similar ao FILE() que verifica se ele está lá?
-
Valeu Jorge.
O código que o Sputnik enviou resolve meu problema. Eu só mandei o exemplo para o João porque ele não estava entendendo o que eu queria. Mas está resolvido. Obrigado.
-
Sputnik,
Valeu pela dica em SQL.
Vou usar o seu código.
-
-
Pessoal,
Existe no xharbour alguma função que retorne apenas o número de registros filtrados numa tabela?
O RecCount() e o LastRec() retornam o total de registros na tabela sem considerar o Scope nem o Filter. Existe algum outro comando que faça isso?
Eu desenvolvi a função abaixo para fazer isso, mas se tiver um comando nativo é mellhor:
******************************************************************************************** Function oaRecCount() // Calcula o número de registros ativos no arquivo (considera ordscope, setfilter, etc.) ******************************************************************************************** Local nRec := 0 Local nReg if Used() nReg := RecN() DbGoTop() Do While !Eof() SysRefresh() nRec = nRec + 1 DbSkip() EndDo DbGoTo( nReg ) endif Return( nRec )
-
Pablo,
Muito obrigado pelo seu comentário otimista sobre o SQLRDD.
Estou com a minha aplicação quase que 100% funcional com ele e estou gostando, tenho apenas algumas situações estranhas como a que mencionei na mensagem inicial desse tópico, mas aos poucos estou conseguindo driblá-las. Vou seguir com essa ferramenta porque foi a única forma que encontrei para mudar sem ter que reescrever muitos códigos que estão funcionando muito bem com DBFCDX.
Um abraço e votos de sucesso.
Oscar Ribeiro
-
Eu também sou fã do DBF, mas não tem mais como fugir desse tal do SQL.
C para xHarbour
in Programação
Posted
Eita João,
Você me ajudou muito!
Só faltava colocar .T. como segundo parâmetro do hb_sha1().
// CRIAR HashCSRT // wCSRT := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO" wChave := "41180678393592000146558900000006041028190697" codigo := wCSRT + wChave codigo1 := hb_sha1(codigo, .T.) codigo2 := HB_Base64encode(codigo1, Len(codigo1)) Msginfo( codigo1+chr(13)+chr(13)+"Modelo: aWv6LeEM4X6u4+qBI2OYZ8grigw="+chr(13)+chr(13)+"Gerado: "+codigo2, "HB_base64encode() -> Tamanho: "+str(len(codigo2)) )
Muito obrigado, mais uma vez.