Problema dll em Delphi + JNA

4 respostas
seudito

Boa tarde pessoal.

Estou tentando utilizar uma dll desenvolvida em Delphi.

Esta dll possui um método que recebe o caminho completo de um arquivo, faz um processo de validação com o arquivo, e retorna true ou false.

Infelizmente não tenho os fontes desta dll, mas em outras linguagens (C++ e C#) consigo utilizá-la sem problemas.

Fiz a seguinte implementação com JNA:

interface LockDll extends Library{
		boolean CheckFile(String path);
	}

	public static void main(String[] args){
		try {
			String path = "D:\\workspace\\file\\file.ini";
			
			LockDll dll = (LockDll) Native.loadLibrary("Check.dll", LockDll.class);
			boolean b = dll.CheckFile(path);
			if(b)
			{
				System.out.println("sucesso");
			}else
			{
				System.out.println("inválido");
			}

		} catch (Exception e) {
			System.out.println("Exception" + e);
		}
	}

Nenhum erro é apresentado... o problema é que o o retorno é sempre false, mesmo quando forço todo o cenário para que retorne true.

Alguém já passou por situação semelhante?

Desde já agradeço!

4 Respostas

Marcelo_SCS

Favor postar o código C++ que faz acesso a DLL.

Tente mudar o tipo de retorno de boolean para int e veja os valores de retorno.

matheuslmota

Cria uma camada em C que acessa a DLL e faz acesso a essa camada usando JNI ou JNA. Vai dar um trabalho desgraçado, mas não há alguma outra solução imediata para o problema.
Ou então você pode procurar algum componente pago que faça a ponte entre a DLL Delphi e o Java.

seudito

Em C++ a dll só funciona se passo como parâmetro std::string. Quando testo com CString ou char*, não dá erro, mas o método da dll retorna sempre false, mesmo quando deveria retornar true (mesma coisa que ocorre quando passo uma String Java) :

CString dll = _T("Check.dll");
		HINSTANCE hInstLock = LoadLibrary(dll);
		if(!hInstLock)
		{
			_tprintf(_T("ERRO ao carregar Check.dll"));
			return(FALSE); 
		}
		 FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hInstLock),"CheckFile"); 
		
		if(!lpfnGetProcessID )
		{
			_tprintf(_T("ERRO metodo CheckFile nao encontrado"));
			return(FALSE); 
		}

		typedef BOOL (__stdcall * pICFUNC)(std::string); 
		 pICFUNC CheckFile; 
		CheckFile = pICFUNC(lpfnGetProcessID); 
		
		std::string path = "D:\\workspace\\lockeletronico\\lock.ini";

		BOOL b = CheckFile(path);

		if(!b)
		{
			_tprintf(_T("ERRO: lock invalido"));
			FreeLibrary(hInstLock);
		}
		FreeLibrary(hInstLock);
			_tprintf(_T("######### SUCESSO #############"));
		}

Em C#:

internal class CheckInterface
    {
        [DllImport("Check.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        private static extern bool CheckFile(string fileName);

        public static bool Check(string filePath)
        {
            return CheckFile(filePath);
        }
    }

Infelizmente não possuo os fontes da dll (originalmente desenvolvida em delphi), então se eu não conseguir utilizar esta dll como está, terei que procurar uma outra alternativa mesmo... :roll:

Marcelo_SCS

Ao invés de usar String no Java, tente usar Memory do JNA. Talvez funcione.

Criado 4 de dezembro de 2012
Ultima resposta 15 de dez. de 2012
Respostas 4
Participantes 3