我想使用Java应用程序中的MMDevice API。有哪些选项?
我尝试使用JNA。看起来我不能使用JNA类型库解析,因为没有此API(Is there a COM type library for Windows Core Audio)的类型。正如建议的那样,我需要提供自己的API声明。
因此,我还尝试了两个手动声明的JNA示例,但它们给予了“Interface not supported HRESULT=80004002”错误:
public class MMDeviceAPITest {
public static void test1() {
try {
Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED);
var obj = new Test1.MMDeviceEnumerator(); // exception E_NOINTERFACE (HRESULT: 80004002)
// ...
} finally {
Ole32.INSTANCE.CoUninitialize();
}
}
public static void test2() {
try {
Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED);
var factory = new Factory();
var obj = factory.createObject(Test2.MMDeviceEnumerator.class); // exception E_NOINTERFACE (HRESULT: 80004002)
var in = obj.queryInterface(Test2.IMMDeviceEnumerator.class);
// ...
} finally {
Ole32.INSTANCE.CoUninitialize();
}
}
}
interface Test1 {
class MMDeviceEnumerator extends COMLateBindingObject {
public MMDeviceEnumerator() {
super(new Guid.CLSID("bcde0395-e52f-467c-8e3d-c4579291692e"), true);
}
}
}
interface Test2 {
@ComObject(clsId = "bcde0395-e52f-467c-8e3d-c4579291692e")
interface MMDeviceEnumerator extends IUnknown {} // doesn't extend IUnknown in C sources, probably it's the problem...
@ComInterface(iid = "a95664d2-9614-4f35-a746-de8db63617e6")
interface IMMDeviceEnumerator extends IUnknown {}
}
我能从Java访问这个API吗?我能为JNA创建工作声明吗?或者使用另一个框架?
我的最后一个想法是创建/找到一个封装所需COM调用的微型原生应用程序/库,这样我就可以轻松地调用此应用程序/库(通过子进程或简单的JNA声明)。
2条答案
按热度按时间ss2ws0br1#
docs you linked显示了如何使用
CoCreateInstance
创建:这会让你接近JNA
我使用了JNA中
IWbemContext
的实现作为上面的模板。您可以参考该类来获得COM函数Map的示例。6tdlim6h2#
出于某种原因,我不能建议修改丹尼尔Widdis的答案。答案对我很有效,非常感谢!只是想以示例的形式展示如何Map一个方法: