无法通过JNA访问IActiveDesktop接口(不支持这种接口(HRESULT:80004002)

问题描述 投票:1回答:1

我正在尝试使用IActiveDesktop界面在Windows 7上更改桌面墙纸。因此,我开始我的项目,首先使用SystemParametersInfo类使用User32方法。但是没有褪色效果,我无法修改图像位置。经过研究,我发现了IActiveDesktop接口和这个question。我接受了答案,并做出了调整。但是,当我运行代码时,它会抛出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());
    }
}

还有刚刚加载Ole32库和IActiveDesktop接口的Main:

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();
        }
    }
}

经过大量的搜寻,我找不到答案。谁能帮我?可能的答案是where I found this code...在这种情况下,请向我解释问题所在。谢谢。

注意:我是法语,所以我的英语不太好。对不起...

java windows-7 jna
1个回答
0
投票

我终于找到了解决方案。初始化Ole32时,将Ole32.COINIT_MULTITHREADED替换为Ole32.COINIT_APARTMENTTHREADED

© www.soinside.com 2019 - 2024. All rights reserved.