Página 1 de 2

Teste de stream no windows

Enviado: 28 Jun 2020 00:49
por Vlademiro
Pessoal, uma rotina que criei está funcionando perfeitamente no Linux mas no Windows dá um problema. O Harbour que tenho aqui é meio antigo, foi o que veio com a HMG, portanto é de 2016 e o do Linux é de 2019. Daria para alguém que tivesse um Harbour (windows) mais novo testar essa rotina ?

Basicamente o que ela faz é ler uma imagem no próprio executável e depois salva.
Eu vou postar um teste com o trecho isolado:

Código: Selecionar todos


FUNCTION Main()


    MemoWrit( "novo.jpg" , Imagem() )


    RETURN NIL

FUNCTION Imagem()

  LOCAL cReturn := ""
 
#ifdef __PLATFORM_WINDOWS__ 
#pragma __streaminclude "imagem\01.jpg" | cReturn := %s
#else
#pragma __streaminclude "imagem/01.jpg" | cReturn := %s
#endif
  
RETURN cReturn


Zip com a imagem 01.jpg incluída.
stream.zip
(47.82 KiB) Baixado 207 vezes
Agradeço a ajuda!

Teste de stream no windows

Enviado: 28 Jun 2020 00:52
por Vlademiro
Complementando...

A imagem gerada (novo.jpg) deverá ser vista sem falhas. Aqui no Windows só salva a dimensão dela, mas a imagem em si não. Tomara que seja a versão do Harbour...

Teste de stream no windows

Enviado: 28 Jun 2020 04:26
por JoséQuintas

Código: Selecionar todos

 #pragma __binarystreaminclude "image\xx.jpg"   | RETURN %s

Teste de stream no windows

Enviado: 28 Jun 2020 08:16
por Vlademiro
Não deu certo.
Pode ser a função que faz a escrita (MemoWrit, que foi criada para manipular textos) ou o harbour que eu tenho aqui que, como falei, é de 2016 (no Linux funciona mesmo com Memowrit).

Por isso eu pedi para testarem.
Se alguém puder testar essa rotina eu agradeço.

Teste de stream no windows

Enviado: 28 Jun 2020 12:22
por JoséQuintas
Testou com retorno direto, sem variável?
Uso do jeito que mostrei normalmente, pra imagens de qualquer tipo e/ou DLL e/ou qualquer coisa.
Na gravação, é lógico, uso hb_MemoWrit() pra que não seja acrescentado control-z no final.

Teste de stream no windows

Enviado: 28 Jun 2020 12:45
por Vlademiro
Testei com memowrit e hb_memowrit. Não funcionou. No Linux funciona com as duas funções.

Quintas, qual a versão do harbour q vc usa ?

Teste de stream no windows

Enviado: 28 Jun 2020 15:07
por JoséQuintas
3.4

Colocou do jeito que mostrei, com BINARY ?

Teste de stream no windows

Enviado: 28 Jun 2020 16:14
por Vlademiro
Sim. Não funcionou.

Teste de stream no windows

Enviado: 28 Jun 2020 16:14
por Vlademiro
Vou pegar uma versão mais nova do harbour.

Teste de stream no windows

Enviado: 28 Jun 2020 19:46
por JoséQuintas
Mais uma coisa: Uso MINGW no Windows
Não sei se pode estar relacionado ao compilador C.

Teste de stream no windows

Enviado: 29 Jun 2020 04:15
por Vlademiro
Quintas,

Funcionou conforme vc informou.

O meu teste ficou assim :

Código: Selecionar todos

FUNCTION Main()

    HB_MemoWrit( "novo.jpg" , Imagem() )

    RETURN NIL

FUNCTION Imagem()

  LOCAL xReturn := ""
 
#pragma __binarystreaminclude "imagem\01.jpg"   | xReturn := %s 
  
RETURN xReturn
A variável xReturn nem precisava, é porque eu gosto de verificar algum possível erro depois da operação. Na rotina posso ver o tamanho dela, por exemplo.

Mas o que aconteceu, afinal ?

Eu que estava errando a diretiva.
Não é __PLATFORM_WINDOWS__
Mas sim __PLATFORM__WINDOWS

Como estava informada errada, o programa sempre pegava a definição para Linux, que não estava alterada para binary.

Na verdade, não precisa da diretiva. O Harbour converte automaticamente.
Fiz o teste com :

Código: Selecionar todos

#pragma __binarystreaminclude "imagem/01.jpg"   | cReturn := %s 
Repare que só mudou a barra (que é no padrão *NIX) e também funcionou no Windows.

Agora, interessante é que no Linux não precisei usar __binarystreaminclude nem Hb_Memowrit. Vou alterar o código aqui para que funcione nos dois.

Obrigado!

Teste de stream no windows

Enviado: 29 Jun 2020 14:06
por Poka
Vlademiro, boa tarde

Qual a real finalidade dessa função?

Poka

Teste de stream no windows

Enviado: 29 Jun 2020 15:14
por Vlademiro
Poka, essa função serve para várias finalidades. Ela serve para "embutir" no seu aplicativo arquivos de qualquer espécie.

Pelo que eu entendi o Quintas usa para mandar a DLL "dentro" do seu aplicativo e, lá no cliente, verifica se a DLL existe com FILE, se não existir "escreve" ela com hb_Memowrit. Nunca tinha pensado nesse uso, mas é bem legal, porque se alguém apagar a DLL o programa cria de novo porque o binário está dentro dele.

Eu já embuti arquivos xml na minha aplicação, páginas web, imagens e outros.

Agora, ela não é bem uma função. Não sei bem o nome que dá, porque ela funciona em tempo de compilação (como um #define).
Vc compila seu aplicativo e "embute" o que quiser dentro da sua aplicação.

É como se fosse um "resource", só que é do próprio Harbour, funciona em qualquer plataforma e aceita qualquer arquivo.

Teste de stream no windows

Enviado: 29 Jun 2020 16:41
por JoséQuintas
Vlademiro escreveu:Pelo que eu entendi o Quintas usa para mandar a DLL "dentro" do seu aplicativo e, lá no cliente, verifica se a DLL existe com FILE, se não existir "escreve" ela com hb_Memowrit.
Exato.
Uso de ícones 11MB.
Se uso 11MB pra tranqueira, porque não mais 3MB em coisas úteis?

29/06/2020 16:39 3.181.437 ze_resource.o
29/06/2020 16:39 11.000.293 ze_resource.c
29/06/2020 16:39 11.119.618 jpa.reso

29/06/2020 16:39 6.545.328 jpa.exe

Teste de stream no windows

Enviado: 29 Jun 2020 16:48
por JoséQuintas
E se der pra registrar automático a DLL do MySQL.... vai junto também.

Por enquanto:

capicom.dll
msxml5.dll
msxml5r.dll
rmchart.dll