amir tarek Ответов: 1

Вызов функции VS6 C DLL из кода java


я делаю простую функцию c в Visual studio 6 это код
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)


{
    return TRUE;
}

extern "C" __declspec(dllexport) char __stdcall GetCompanyCode()
{
    return 1;
}

мне нужно вызвать функцию GetCompanyCode из java поэтому я использовал JNA сначала я создаю интерфейс на java
package javaapplication4;
import com.sun.jna.Library;
/**
 *
 * @author amir
 */
public interface CompanyCode extends Library
{
    public  byte GetCompanyCode();
}

затем загрузите библиотеку dll
import java.io.FileNotFoundException;
import java.io.IOException;
import com.sun.jna.Native;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;

/**
 *
 * @author amir
 */
public class JavaApplication4 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws  IOException, FileNotFoundException, NoSuchAlgorithmException 
    {
        System.setProperty("jna.library.path", "C:/");
        CompanyCode Company= (CompanyCode)Native.loadLibrary("CompanyCode", CompanyCode.class);
        byte x=Company.GetCompanyCode();
        System.out.println(x);
    }
}

я получил ошибку

Цитата:
Исключение в потоке "основной" Java для.яз.UnsatisfiedLinkError: ошибка поиска функции 'GetCompanyCode': Указанную процедуру найти не удалось.

на ком.солнце.Юна.Функция.(Function. java: 179) at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:347) at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:327) at com.sun.jna.Library$Handler.invoke(Library.java:203) at com.sun.proxy.$Proxy0.GetCompanyCode(неизвестный источник) на javaapplication4.JavaApplication4.основной(JavaApplication4.Ява:28) C:\Users\amir\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Ява вернулись: 1 построить не удалось (общее время: 0 секунд)


что же мне делать?

Что я уже пробовал:

теперь я не знаю, что еще мне делать, я много гуглил, но то, что я нашел, я уже сделал

1 Ответов

Рейтинг:
12

KarstenK

Вы должны внимательно прочитать и понять сообщение об ошибке. Вот "ошибка поиска функции 'GetCompanyCode': Указанную процедуру найти не удалось."

Итак, компоновщик говорит, что dll найдена но функции нет. Посоветуйтесь со старым добрымдеведенты Уокер что имя функции правильно экспортировано. Я предполагаю, что __stdcall вносит некоторые изменения в так называемое оформленное имя.

И я бы экспортировал int в качестве результата, потому что это собственный тип данных.


amir tarek

я попробовал Dependency walker, и имя функции-_GetCompanyCode@0, так как же я преобразую это имя в GetCompanyCode?

amir tarek

я решил это я пользователь StdCallFunctionMapper чтобы изменить имя