Problema dll em Delphi + JNA

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:

[code]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);
	}
}[/code]

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!

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.

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.

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) :

[code]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 #############"));
	}[/code]

Em C#:

[code]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);
    }
}[/code]

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:

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