Windows API с использованием JNA: указанная процедура не может быть найдена

Мне нужно использовать функцию RegLoadKey в моем коде Java с помощью JNA, но я получаю следующее сообщение об ошибке:

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: Ошибка при поиске функции RegLoadKey: указанная процедура не найдена. Blockquote

RegLoadKey синтаксис

LONG WINAPI RegLoadKey(
  _In_      HKEY hKey,
  _In_opt_  LPCTSTR lpSubKey,
  _In_      LPCTSTR lpFile
);

мой код: Advapi32.java

import com.sun.jna.platform.win32.WinReg.HKEY;
import com.sun.jna.win32.StdCallLibrary;

public interface Advapi32 extends StdCallLibrary
{
    long RegLoadKey(HKEY hKey, String lpSubKey,String lpFile);
}

apiTest.java

import com.sun.jna.*;
import com.sun.jna.platform.win32.WinReg.HKEY;
public class apiTest
{
       public static void main (String [] args)
       {

          Advapi32 lib2 = (Advapi32) Native.loadLibrary("Advapi32", Advapi32.class);
          HKEY key1 = new HKEY();
          String filePath = "C:\\tmp\\software";
          String regName = "loadedRegKey";
          long test = lib2.RegLoadKey(key1, regName, filePath);
       }

Я думаю, что есть несколько проблем с моим кодом. Я новичок в Windows API и JNA.

3 ответа

Знаете ли вы, что инкапсуляция Advapi32 уже является частью JNA? Посмотрите здесь. Я только что видел, что ваш метод RegLoadKey там еще не добавлено. Так что добавьте это и отправьте это изменение ребятам JNA. После этого вы можете использовать его следующим образом (псевдокод):

public class RegistryRead{

 private Advapi32 api = null;

 public RegistryRead(){
    this.api = Advapi32.INSTANCE;
 }

 public void read() {
    long winapi = this.api.RegLoadKey(HKEY hkey, String subkey, String file);
    ...
 }
}

Если вы посмотрите на Advapi32 отображение библиотеки , поставляемое с JNA, вы увидите, что создание экземпляра библиотеки включает в себя некоторые параметры метода загрузки. Среди прочего, эти параметры загрузки автоматически отображают такие вещи, как RegLoadKey в RegLoadKeyW, которое является настоящим именем функции, на которую вы пытаетесь связать.

Это типичная ошибка разработки JNA. Просто добавьте, прежде чем использовать его.

System.setProperty("jna.library.path","PATH_TO_LIBRARY_JNA");

PATH_TO_LIBRARY_JNA - абсолютный путь к jna lib

Другие вопросы по тегам