我已经设法让 COM4J 使用 windows IMAPI(CD 写入)中的一些功能。
但是,我未能让任何返回 SAFEARRAYs 的调用正常工作,但这个项目目前似乎没有处于活动状态......
DLL一般在C:\Windows\System32\imapi2.dll,使用它也需要使用C:\Windows\System32\imapi2fs.dll
寻找一个活跃的 JAVA-COM 桥接项目将我带到了 JNA。
简化 JAVA-COM 桥接项目的职权范围引起了我的兴趣....但是我遇到了第一个障碍,希望有人能提供帮助。
到目前为止,我已经采用了 Microsoft IMAPI 示例并编写了一个 Powershell 应用程序,从中我可以对 API 进行一系列调用。[CDInterface][1]
使用 IMAPI 需要做的第一件事是创建 IDiskMaster2 的实例,所以我已经通过 Imapi2 接口声明了它,就像这样
public interface Imapi2 extends Library {
Imapi2 INSTANCE = (Imapi2)
Native.load("C:/Windows/System32/imapi2.dll" , Imapi2.class);
public static class IDiscMaster2 extends Structure {
int getCount;
public int getCount() {
return getCount;
}
}
IDiscMaster2 createMsftDiscMaster2();
}
然后在主代码中
Imapi2.IDiscMaster2 recorderList = Imapi2.INSTANCE.createMsftDiscMaster2();
System.out.println("Found " + recorderList.getCount() + " Recorders");
只是将“imapi2”放在对 Native.load() 的调用中也不起作用。
我猜我在做一些根本错误的事情,但目前尚不清楚你如何让 JNA '看到'一个你想要接口的新 dll ..... 而且我有点害怕有一些非常不同的东西这个 API 来自人们使用 JNA 与之交谈的其他 API,因此可能不值得尝试!
public interface Imapi2 extends Library {
Imapi2 INSTANCE = (Imapi2)
Native.load("C:/Windows/System32/imapi2.dll" , Imapi2.class);
public class IDiscMaster2 extends Dispatch {
public static final CLSID CLSID_MsftDiscMaster2 = new CLSID("2735412F-7F64-5B0F-8F00-5D77AFBE261E");
public IDiscMaster2() {
}
private IDiscMaster2(Pointer pvInstance) {
super(pvInstance);
}
public static IDiscMaster2 create() {
PointerByReference pbr = new PointerByReference();
WinNT.HRESULT hres = Ole32.INSTANCE.CoCreateInstance(CLSID_MsftDiscMaster2, null, WTypes.CLSCTX_ALL, null, pbr);
if (COMUtils.FAILED(hres)) {
System.out.println("ERROR: Failed to create instance");
return null;
}
return new IDiscMaster2(pbr.getValue());
}
public WinNT.HRESULT _getCount(Pointer count ){
return (WinNT.HRESULT) _invokeNativeObject(2, new Object[]{count}, WinNT.HRESULT.class);
}
public long getCount() {
try {
long count = -1;
Pointer ptr = new Pointer(count);
WinNT.HRESULT result = _getCount(ptr);
COMUtils.checkRC(result);
return count;
} catch ( Exception e ) {
System.out.println("Error : " + e.getMessage());
}
return -1;
}
}
然后在 main 中的调用更改为
Imapi2 imapi2Lib = Imapi2.INSTANCE;
Imapi2.IDiscMaster2 recorderList = new Imapi2.IDiscMaster2();
System.out.println("Found " + recorderList.getCount() + " Recorders");
IntelliJ 显示未调用的方法,因此它看起来不像 create() 被调用。不确定这是因为我需要调用它,还是因为实现 IDispatch 而不是 IUnknown 的函数。[1]:https ://github.com/nosdod/CDInterface