Javafree
Página Inicial do Fórum > Java Avançado

O que causa a Exception "Invalid memory access"



Criar novo tópico   Responder tópico


  1. Bruno Cruz
    Posts:6


    Comment Arrow

    Publicado em: 21/09/2016 09:12:59

    Estou tentando executar um método de uma dll que tem a seguinte assinatura:

    int PrtPrinterCreatorW( void** phandle, const TCHAR* model);

    Na interface Java defini da seguinte forma:

    public int PrtPrinterCreatorW(PointerByReference phandle, char[] model);

    Até aqui está executando sem problemas.

    A questão é quanto tento executar o seguinte método:

    int PrtPortOpenW(void* handle, const TCHAR* ioSettings);

    Na minha interface esta definido da seguinte forma:

    public int PrtPortOpenW(Pointer handle, char[] ioSettings);

    O ponteiro que passo para essa função recebe o valor do PointerByReference:

    handle = phandle.getValue();

    Mas esta dando o seguinte erro:

    Exception in thread "main" java.lang.Error: Invalid memory access
    at com.sun.jna.Native.invokeInt(Native Method)
    at com.sun.jna.Function.invoke(Function.java:390)
    at com.sun.jna.Function.invoke(Function.java:323)
    at com.sun.jna.Library$Handler.invoke(Library.java:236)
    at com.sun.proxy.$Proxy0.PrtPortOpenW(Unknown Source)
    at br.com.elgin.DLLI9I7.Funções.ConfigLibary.portOpen(ConfigLibary.java:31)
    at br.com.elgin.DLLI9I7.Funções.Execução.main(Execução.java:17)


    Qual o motivo dessa exceção?
    Toda ajuda será bem-vinda.



  1. Bruno Cruz
    Posts:6


    Comment Arrow

    Publicado em: 21/09/2016 09:16:49

    Tenho um exemplo da execução dele em Delphi. Se ajudar posso disponibilizar.



  1. staroski
    Posts:4600


    Comment Arrow

    Publicado em: 21/09/2016 09:44:41

    Tenta mudar a assinatura da sua interface para ser assim:


    Ou assim

    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    http://www.staroski.com.br

    Acesse http://www.guj.com.br/



  1. Bruno Cruz
    Posts:6


    Comment Arrow

    Publicado em: 21/09/2016 10:25:24

    Testei das duas formas e obtive o mesmo resultado.

    no exemplo em delphi está da sequinte forma:

    function PrtPrinterCreatorW(printer: PPointer;model:string): Integer; cdecl ; external 'HprtPrinter.dll';
    function PrtPortOpenW(printer: Pointer;portSetting:string): Integer; cdecl ; external 'HprtPrinter.dll';



  1. Bruno Cruz
    Posts:6


    Comment Arrow

    Publicado em: 21/09/2016 10:56:30

    Tentei passar para o handle o ponteiro:

    handle = phandle.getPointer();

    E consegui executar algumas vezes. Mas na maioria das execuções da erro, digamos que a cada 15 vezes que eu executo uma não da erro.
    Muito estranho

    O que pode ser ?



  1. staroski
    Posts:4600


    Comment Arrow

    Publicado em: 21/09/2016 13:54:50

    Não tens a documentação da DLL?
    Imagino que o handle esteja sendo alterado durante a execução do código nativo.

    Tenta utilizar como parâmetro, um array de bytes ao invés de um Pointer.


    Depois de chamar o método, podes conferir se o conteúdo do array de bytes não foi modificado.


    Só vai te dar um pouco de trabalho pois terás de converter o handle , que deve ser um int, para um array de 4 bytes
    Podes obter 4 bytes a partir de um int dessa forma:

    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    http://www.staroski.com.br

    Acesse http://www.guj.com.br/



  1. Bruno Cruz
    Posts:6


    Comment Arrow

    Publicado em: 21/09/2016 18:06:39

    Tenho sim a documentação, segue em anexo. Ela esta com alguns erro, mas da pra ter uma boa noção. O que está diferente estou conferindo no exemplo delphi.

    Tbm estou enviando um dos códigos em delphi que tenho de exemplo.

    Tentei passar um array de byte. Ele não está dando o erro, mas me retorna um status que não sei identificar.

    Só para você entender, o primeiro método PrtPrinterCreatorW "criar o objeto de impressora de destino".

    o segundo abre a porta. no caso estou tentando abrir a porta USB.

    Pelo que entendi, tenho que utilizar o valor do PointerByReference phandle que passo no primeiro método.

    Mas não sei bem como fazer isso

    [/code]



  1. Bruno Cruz
    Posts:6


    Comment Arrow

    Publicado em: 21/09/2016 18:21:44

    *Pelo que entendi, tenho que utilizar o valor do PointerByReference phandle que passo no primeiro método para o método PrtPortOpenW*

    exemplo: PrtPortOpenW(parametro VALOR_phandle, string ioSetings)...

    estou anexando novamente o código delphi e a documentação.



  1. staroski
    Posts:4600


    Comment Arrow

    Publicado em: 22/09/2016 11:12:36

    Anexos não funcionam no fórum já faz anos
    _________________

    Ricardo Artur Staroski, OCP-JP
    Blumenau - SC
    http://www.staroski.com.br

    Acesse http://www.guj.com.br/



  1. Relacionados