Получение файла значка и номера изображения для ShellIconOverlayIdentifier с использованием JNA - PullRequest
0 голосов
/ 30 апреля 2019

Я нашел этот пример для запроса файла значка и номера изображения для идентификатора наложения значка оболочки с использованием некоторого кода C / C ++. К сожалению, я не разработчик C ++, поэтому я попытался написать код на Java с использованием JNA.

Поэтому я создал интерфейс для IShellIconOverlayIdentifier:

public interface IShellIconOverlayIdentifier extends IUnknown {

    public final static IID IID_ISHELLICONOVERLAYIDENTIFIER = new IID("{0C6C4200-C589-11D0-999A-00C04FD655E1}");

    HRESULT GetOverlayInfo(LPWSTR pwszIconFile, int cchMax, IntByReference pIndex, DWORDByReference pdwFlags);

    HRESULT GetPriority(IntByReference pPriority);

    HRESULT IsMemberOf(WString pwszPath, DWORD dwAttrib);
}

и соответствующий класс реализации ShellIconOverlayIdentifier:

public class ShellIconOverlayIdentifier extends Unknown implements IShellIconOverlayIdentifier {

    public ShellIconOverlayIdentifier() {
    }

    public ShellIconOverlayIdentifier(Pointer pvInstance) {
        super(pvInstance);
    }

    @Override
    public HRESULT GetOverlayInfo(LPWSTR pwszIconFile, int cchMax, IntByReference pIndex, DWORDByReference pdwFlags) {
        return (HRESULT) this._invokeNativeObject(3, new Object[] { this.getPointer(), pwszIconFile, cchMax, pIndex, pdwFlags }, HRESULT.class);
    }

    @Override
    public HRESULT GetPriority(IntByReference pPriority) {
        return (HRESULT) this._invokeNativeObject(4, new Object[] { this.getPointer(), pPriority }, HRESULT.class);
    }

    @Override
    public HRESULT IsMemberOf(WString pwszPath, DWORD dwAttrib) {
        return (HRESULT) this._invokeNativeObject(5, new Object[] { this.getPointer(), pwszPath, dwAttrib }, HRESULT.class);
    }
}

Но если я сейчас попытаюсь использовать эти классы

HRESULT hr;

hr = Ole32.INSTANCE.CoInitializeEx(null, Ole32.COINIT_MULTITHREADED);
COMUtils.checkRC(hr);

GUID clsid = Ole32Util.getGUIDFromString("{C5994560-53D9-4125-87C9-F193FC689CB2}"); // DropboxExt01
PointerByReference ppv = new PointerByReference();
hr = Ole32.INSTANCE.CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_ISHELLICONOVERLAYIDENTIFIER, ppv);
COMUtils.checkRC(hr);

Unknown u = new Unknown(ppv.getValue());
PointerByReference pbr = new PointerByReference();
hr = u.QueryInterface(new REFIID(IID_ISHELLICONOVERLAYIDENTIFIER), pbr);
COMUtils.checkRC(hr);

ShellIconOverlayIdentifier pISIOI = new ShellIconOverlayIdentifier(ppv.getValue());

LPWSTR pwszIconFile = new LPWSTR();
DWORDByReference pdwFlags = new DWORDByReference();
IntByReference pIndex = new IntByReference();

hr = pISIOI.GetOverlayInfo(pwszIconFile, 128, pIndex, pdwFlags);
COMUtils.checkRC(hr);

System.out.println("Icon Path:\n    " + pwszIconFile.getValue() + " " + pIndex.getValue());
pISIOI.Release();

Ole32.INSTANCE.CoUninitialize();

При выполнении я получаю следующее исключение:

Exception in thread "main" com.sun.jna.platform.win32.COM.COMException: An den Stub wurde ein Nullzeiger übergeben.(HRESULT: 800706f4)
    at com.sun.jna.platform.win32.COM.COMUtils.checkRC(COMUtils.java:117)
    at overlay.Test.main(Test.java:45)

Кто-нибудь может мне помочь с этим кодом?

...