Die Instanz von ITaskbarList3 konnte nicht erstellt werdenJava

Java-Forum
Guest
 Die Instanz von ITaskbarList3 konnte nicht erstellt werden

Post by Guest »

Ich lerne die neue Java-FFM-API.
Während des Lernens habe ich mich entschieden, Windows SDK zur Steuerung der Taskleiste zu verwenden.
Die Schnittstelle ITtaskbarList3< /code> stellt die Taskleiste dar und bietet Funktionen zu deren Steuerung.
Ich habe das Tool jextract verwendet, um die erforderlichen Klassen zu generieren:

Code: Select all

jextract --output target/generated-sources/jextract -t "taskbar_test.gen" -l :shell32 -l :Explorerframe -l :ole32 -I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared" -I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um" -I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\km" -I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\km\crt" "C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\ShObjIdl_core.h"
Im folgenden Code versuche ich, CLSID und IID aus der Zeichenfolge abzurufen und sie zu verwenden, um eine Instanz von ITaskbarList3 zu erhalten:

Code: Select all

package taskbar_test;

import taskbar_test.gen.CLSID;
import taskbar_test.gen.ShObjIdl_core_h;

import java.lang.foreign.Arena;
import java.lang.foreign.MemorySegment;

public class ComStart {

public static final String GUID_FORMAT = "{%s}";

// CLSID of ITaskbarList3
public static final String CLSID_CONST = "56FDF344-FD6D-11d0-958A-006097C9A090";
// IID of ITaskbarList3
public static final String IID_CONST = "EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF";

public static void main(String[] args) {

try (var arena = Arena.ofConfined()) {
// https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-clsidfromstring#remarks
// The CLSID format is {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
var clsidString = arena.allocateFrom(GUID_FORMAT.formatted(CLSID_CONST));
var iidString = arena.allocateFrom(GUID_FORMAT.formatted(IID_CONST));
var clsid = arena.allocate(CLSID.layout());
var iid = arena.allocate(CLSID.layout());
var taskbarPtr = arena.allocate(ShObjIdl_core_h.C_POINTER);

int hr = ShObjIdl_core_h.CoInitializeEx(MemorySegment.NULL, ShObjIdl_core_h.COINIT_MULTITHREADED());
if (hr != ShObjIdl_core_h.S_OK()) {
throw new RuntimeException("CoInitialize failed with error code: " + hr);
}

hr = ShObjIdl_core_h.CLSIDFromString(clsidString, clsid);
if (hr != ShObjIdl_core_h.S_OK()) {
throw new RuntimeException("CLSIDFromString failed with error code: " + hr);
}

hr = ShObjIdl_core_h.IIDFromString(iidString, iid);
if (hr != ShObjIdl_core_h.S_OK()) {
throw new RuntimeException("IIDFromString failed with error code: " + hr);
}

hr = ShObjIdl_core_h.CoCreateInstance(clsid, MemorySegment.NULL, ShObjIdl_core_h.CLSCTX_REMOTE_SERVER(), iid, taskbarPtr);
if (hr != ShObjIdl_core_h.S_OK()) {
if (hr == ShObjIdl_core_h.REGDB_E_CLASSNOTREG()) {
System.out.println("COM class is not registered!");
}
throw new RuntimeException("CoCreateInstance failed with error code: " + hr);
}

} finally {
ShObjIdl_core_h.CoUninitialize();
}
}

}
Ich erwarte, die Instanz zu erhalten, aber stattdessen erhalte ich eine Fehlermeldung von der Funktion CLSIDFromString, dass die Zeichenfolge nicht das richtige Format hat. Ich verstehe nicht warum, weil das Format der Dokumentation folgt.
Wie der Code aussehen sollte, um die Instanz korrekt abzurufen, damit ich die Taskleiste verwalten kann, nämlich den Fortschrittswert festlegen.
Vielen Dank.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post