Невозможно получить доступ к интерфейсу IActiveDesktop с помощью JNA (такой интерфейс не поддерживается (HRESULT: 80004002) - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь изменить обои рабочего стола на windows 7 с интерфейсом IActiveDesktop. Поэтому я запускаю свой проект и сначала использую метод SystemParametersInfo , используя класс User32 . Но эффект затухания отсутствует, и я не могу изменить положение изображения. После некоторых исследований я нашел интерфейс IActiveDesktop и этот вопрос . Я взял ответ и адаптировал его. Но когда я запускаю свой код, он выдает Exception in thread "main" com.sun.jna.platform.win32.COM.COMException: No such interface supported(HRESULT: 80004002).

Здесь вы можете найти мой код:

Сначала класс, представляющий интерфейс IActiveDesktop

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.COM.COMUtils;
import com.sun.jna.platform.win32.COM.Unknown;
import com.sun.jna.platform.win32.*;
import com.sun.jna.ptr.PointerByReference;

import static com.sun.jna.platform.win32.Ole32.INSTANCE;

public class ActiveDesktop extends Unknown {

    // {75048700-EF1F-11D0-9888-006097DEACF9}
    // {F490EB00-1240-11D1-9888-006097DEACF9}

    private static final Guid.GUID CLSID_ActiveDesktop = getGUID("{75048700-EF1F-11D0-9888-006097DEACF9}");
    private static final Guid.GUID IID_IActiveDesktop = getGUID("{F490EB00-1240-11D1-9888-006097DEACF9}");

    private static Guid.GUID getGUID(String guidStr) {
        Guid.GUID guid = new Guid.GUID();

        INSTANCE.IIDFromString(guidStr, guid);

        return guid;
    }

    private ActiveDesktop(Pointer pvInstance) {
        super(pvInstance);
    }

    public static ActiveDesktop create(){
        PointerByReference p = new PointerByReference();

        WinNT.HRESULT hr = INSTANCE.CoCreateInstance(CLSID_ActiveDesktop, null, WTypes.CLSCTX_INPROC_SERVER, IID_IActiveDesktop, p); // THE EXCEPTION IS THROW HERE
        COMUtils.checkRC(hr);

        return new ActiveDesktop(p.getValue());
    }
}

И Main, который просто загружает библиотеку Ole32 и интерфейс IActiveDesktop:

import com.sun.jna.platform.win32.Ole32;

public class Main {

    public static void main(String[] args) {
        Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED);

        try {
            ActiveDesktop desktop = ActiveDesktop.create();
        } finally {
            Ole32.INSTANCE.CoUninitialize();
        }
    }
}

После долгих поисков я не могу найти ответ. Может кто-нибудь мне помочь? Может быть, ответ , где я нашел этот код ... В этом случае, пожалуйста, объясните мне, что не так. Спасибо.

NB: Я француз, поэтому мой английский sh не идеален. Извини ...

1 Ответ

0 голосов
/ 03 мая 2020

Я наконец нашел решение. Что должно заменить Ole32.COINIT_MULTITHREADED на Ole32.COINIT_APARTMENTTHREADED при инициализации Ole32.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...