Ir para conteúdo
  • Cadastre-se

bnobre

Membro Pro Verificado
  • Total de ítens

    1.747
  • Registro em

  • Última visita

  • Days Won

    4

Tudo que bnobre postou

  1. Oi @Daniel Simoes, Vou ver sim, mas a grande maioria pelo que reparei não usa. Legal essa sua técnica de receber eles como parâmetros.
  2. Olá a todos, Aqui nos meus estudos sobre POO reparei que nos componentes do ACBr não se faz o uso das Interfaces do Delphi e muitos programadores sugerem que é mais interessante programar orientado a interfaces do que a objetos. Tem algum motivo em especial para não se fazer o uso de Interfaces nos componentes? Desde já agradeço a atenção
  3. Olá a todos, Na codificação das units do ACBr, muitas vezes é usado a letra A no início do nome dos parâmetros, como por exemplo na unit ACBrJSON (AValue): function AddElement(const AValue: string): TACBrJSONArray; overload; function AddElement(const AValue: Integer): TACBrJSONArray; overload; function AddElementJSON(AValue: TACBrJSONObject): TACBrJSONArray; overload; function AddElementJSONString(const AValue: string): TACBrJSONArray; overload; O que significa e porque usam esse padrão? Desde já agradeço a atenção
  4. Finalmente descobri o significado da linha abaixo: TJsonObject(FValue.O) Está aplicando um Typecast, dizendo que FValue.O trata-se de um TJsonObject. Fonte: https://docwiki.embarcadero.com/RADStudio/Athens/en/Expressions_(Delphi)#Typecasts Já FValue é um um Record onde o field O recebe valores do tipo ponteiros. Portanto FValue.O possui o endereço de memória onde estão gravados objetos json, daí o TypeCast para trata-los como tal. Só ainda não consegui descobrir em qual linha o FValue.O recebe esses endereços.
  5. Exato... Por isso que estou tentando entender O PORQUE Estou no caminho certo em meu entendimento?
  6. Oi pessoal... Acho que a "mágica" está aqui: (Linha 2301 da unit JsonDataObjects_ACBr) function TJsonDataValue.GetObjectValue: TJsonObject; begin if FTyp = jdtObject then Result := TJsonObject(FValue.O) //******************* Aqui else if FTyp = jdtNone then Result := nil else begin TypeCastError(jdtObject); Result := nil; end; end; Quando o tipo armazenado é um objeto(jdtObject) ele retorna o TJsonObject(FValue.O). O FValue.O é um ponteiro, apontando para o local onde está o objeto da lista de arrays em questão. O detalhe é que eu não entendi esse código TJsonObject(FValue.O). Basicamente ele usa o nome da classe como se fosse uma função e o parâmetro é o ponteiro. Isso executa alguma propriedade ou função dentro da classe TJsonObject? Se sim qual?
  7. Sim... Na verdade parece que a "mágica" acontece com o uso de ponteiros na classe TJsonDataValue da unit JsonDataObjects_ACBr. Muito interessante
  8. Oi @Daniel Simoes, tudo bom? Não, na verdade se tento destruir o objeto gera o erro "invalid pointer value", pois conforme o @valterpatrick explicou, o objeto (LJsonObject) está apontando para dentro de outro objeto (LJSon) que já foi destruído, portanto esse endereço de memória não existe mais. Estou apenas estudando o código e melhorando meus conhecimentos na IDE.
  9. Oi meu amigo... Tudo bom? Obrigado pela explicação, faz sentido. Só não consegui achar no código onde exatamente isso acontece. Na linha 81 da unit ACBrConsultaCNPJ.WS.BrasilAPI acontece a criação do objeto: LJsonObject := LJSon.ItemAsJSONObject[I]; Como você disse, está dentro do LJSon, pois inclusive usa uma propriedade desse objeto, a ItemAsJSONObject. Tal propriedade usa a função GetItemAsJSONObject (linha 886 da unit ACBrJSON) para leitura. É aqui que estou me perdendo nesse conceito de "dentro do objeto"... Dentro dessa função temos a seguinte estrutura (removi as diretivas de compilação, exemplo está somente para Windows): function TACBrJSONArray.GetItemAsJSONObject(const AIndex: Integer): TACBrJSONObject; var LJSON: TJsonObject; begin LJSON := FJSON.Items[AIndex].ObjectValue.Clone; try Result := TACBrJSONObject.Create(LJSON); Result.OwnerJSON := True; FContexts.Add(Result); except LJSON.Free; raise; end; end; Suponho que a linha que faz criar o objeto "dentro" do LJson do exemplo é a linha: LJSON := FJSON.Items[AIndex].ObjectValue.Clone; Mas ao tentar estudar esse ObjectValue e esse Clone estou me perdendo. Vou tentar estudar esse código para ver se compreendo melhor. Desde já agradeço a ajuda
  10. Olá a todos, Estou dando uma estudada nos componentes do ACBr e me deparei com uma dúvida na classe TACBrConsultaCNPJWSBrasilAPI presente na unit ACBrConsultaCNPJ.WS.BrasilAPI. A mesma possui uma procedure Executar onde é implementado um código que varre um array de objetos Json e preenche a resposta. São declarados dois objetos para tal LJSon que representa o array e o LJsonObject que representa cada objeto dentro do array. Porém ao final o LJsonObject não precisa ser destruído... Na verdade reproduzi o código e se tentar destruir dá erro. Fui indo cada vez mais fundo nas classes usadas (units ACBrJSON e JsonDataObjects_ACBr), porém não consegui entender o motivo de não precisar destruir o objeto. Alguém poderia me explicar? Desde já agradeço a atenção
  11. Bom dia @Juliomar Marchetti... Respondendo!!!
  12. Cara... Verdade!!! Você usa ou conhece alguém que usa a Integração com o Mercado Livre + Delphi e aplicou essa técnica nessa etapa em que fiquei empacado???
  13. Olá @Daniel Simoes... Tudo bom??? Agora você falou grego pra mim O que seria essa API Web? Poderia me dar um exemplo? Desde já agradeço a atenção
  14. Olá a todos, Estou tentando fazer o processo de autenticação no Mercado Livre usando o Delphi + Httpsend (Synapse) e o mesmo usa o protocolo de autorização OAuth2. O processo na verdade é simples, basta acessar o respectivo link com o os parâmetros responsetype = code, client_id e redirect_uri e será retornado o Código de Autorização após o devido login, aonde o mesmo será usado para a geração dos Tokens. O problema é capturar esse Código de Autorização automaticamente, para não ter que ficar digitando esse link manualmente e nem copiar esse código manualmente. Pelo que pesquisei, normalmente em aplicações desktop quando esse procedimento de autorização OAuth2 é concluído logo em seguida o link de redirect manda o navegador para um endereço local (http://localhost:1500 por exemplo) onde a aplicação está escutando e assim captura o Código de Autorização na URL, exemplo: https://github.com/rvk01/google-oauth2/blob/master/google_oauth2.pas A questão é que o Mercado Livre não deixa especificar endereços locais no redirect_uri das aplicações que serão usadas na integração. Na verdade pelo que li deixava no passado, porém agora não. Portanto se ele não redireciona para um endereço local, minha aplicação não consegue ficar escutando e consequentemente não consigo capturar o parâmetro onde está o Código de Autorização retornado após o login na plataforma. Como vocês fazem nesse caso em particular para a captura automática desse Código de Autorização? Desde já agradeço a atenção
  15. Olá... Tudo bem? Você comentou "a gente". Você fornece esse serviço? Se sim poderia detalhar mais? Desde já agradeço a atenção
  16. Olá a todos, Estamos querendo integrar nosso sistema PDV com soluções de marketplace do mercado, como Shoppe, MercadoLivre, dentre outros. Como todo dia novos marketplaces surgem no mercado, assim como questões técnicas mudam a todo momento nos atuais, os hubs de integração parecem a escolha mais assertiva. Alguém que utilize recomenda algum? Desde já agradeço a atenção
  17. Sim sim... O foco realmente é dificultar para a visualização no Bloco de Notas, com ferramentas profissionais e escaneamento da memória não tem jeito, vai passar. Mas com o foco no Bloco de Notas, creio que o caminho é uma criptografia para embaralhar a string e dificultar o acesso a chave da criptografia, com as técnicas citadas pelo @Daniel Simoes (tabela ASCII com símbolos). Acho que é isso!!!
  18. Olá meu amigo, tudo bom? Eu só não entendi o momento da aplicação desse teu exemplo. Como a String com conteúdo sensível fica exposta o objetivo é ocultá-la, daí a necessidade de criptografá-la, pois o conteúdo exposto ficará ilegível. Porém toda a criptografia precisa de uma chave e ela também ficaria exposta pelo fato de ser String, daí a dica interessante do @Daniel Simoes de usar símbolos fora do alfabeto com o padrão ASCII para a chave e quebrar a mesma em várias partes, pois mesmo ela ficando exposta se misturaria com o resto do código dificultando os hackers básicos... Em que momento você aplica essa técnica que você mencionou acima???
  19. Porém agora me surgiu outra dúvida... Tenho que ter essa preocupação com valores Inteiros também ou essa exposição só ocorre para os tipos String?
  20. Hummmmm... Você está usando valores ASCII que não tem representação no teclado tradicional, exceto pelo #(45) = "-" e #(76) = "L". Eu não me atentei que podia usar valores ASCII que representassem símbolos. https://www.ascii-code.com/ Agora ficou legal!!!
  21. Isso aí ficou legal hein @Daniel Simoes Mas a questão das constantes em ASCII é irrelevante, visto que conforme eu mostrei acima o resultado final escrevendo literalmente ou em ASCII dá na mesma.
  22. Realizei outro teste aqui com o uso de caracteres em ASCII conforme sugerido, mas não mudou em nada, continua exibindo como se tivesse escrito a String de forma direta:
  23. Olá meu amigo, Estava testando aqui... Quando atribuo pelo Object Inspector o valor aparece literal no bloco de notas, porém quando atribuo no *.pas em Runtime, ao contrário do que pensei ele continua aparecendo, não mais de forma literal, porém em Unicode conforme você relatou... Caramba!!!
  24. Ainda pra complementar o meu entendimento até o momento com a leitura de todos os comentários e observações. Vejamos o próprio exemplo do amigo @Daniel Simoes, onde é usado a função StrCrypt do ACBrUtil.FilesIO, que possui a seguinte assinatura: Eu sou obrigado a passar a String que quero criptografar, além da chave criptográfica, como por exemplo executando o código abaixo em RunTime: Nesse momento não tem jeito, antes de efetuar a criptografia tenho que informar os dados de forma literal e eles irão para a tabela Resources, agora não sei se vai dar para ler pelo bloco de notas(exemplo do OLÁ EU SOU UMA STRING) ou não (como no meu caso que relatei). Supondo que não se consiga ler pelo bloco de notas, ainda dá pra ler em memória como o amigo @TiagoTecchio observou e isso mesmo compactando pelo UPX.
  25. Concordo meu amigo... Agora que eu sei dessa "característica", gostaria de saber a técnica usada pelos programadores em Delphi para minimizar tal situação. Pelo relato dos amigos do fórum que são programadores Delphi de longa data, creio que é focar na questão da criptografia e mascaramento da chave criptográfica usando os caracteres ASCII, porém sabendo que não é nada 100%.
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.