Код C#:
Код: Выделить всё
namespace MyComLibrary {
[Guid("SOME_GUID")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public partial interface TestTLBInf
{
[DispId(1)]
String getData();
}
[ComVisible(true)]
[Guid("OTHER_GUID")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("AppInterface.Test")]
public partial class Test : TestTLBInf
{
public String getData()
{
return "test";
}
}
}
Код: Выделить всё
public class JNATest {
private static final String CLSID = "OTHER_GUID";
private static final String IID = "SOME_GUID";
private static final String LIB_NAME = "LIB_NAME";
private static final String LIB_PATH = "LIB_PATH";
public static void main(String[] args) {
System.setProperty("jna.library.path", LIB_PATH);
Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED);
try {
NativeMethodsCls cls = NativeMethodsCls.create();
cls.test();
} finally {
Ole32.INSTANCE.CoUninitialize();
}
}
public static class NativeMethodsCls extends Unknown {
private NativeMethodsCls(Pointer pvInstance) {
super(pvInstance);
}
public static NativeMethodsCls create(){
PointerByReference p = new PointerByReference();
GUID classId = Ole32Util.getGUIDFromString(CLSID);
GUID interfaceId = Ole32Util.getGUIDFromString(IID);
WinNT.HRESULT hr = Ole32.INSTANCE.CoCreateInstance(classId, null, WTypes.CLSCTX_SERVER, interfaceId, p);
COMUtils.checkRC(hr);
NativeMethodsCls handler = new NativeMethodsCls(p.getValue());
return handler;
}
public void test(){
Object result = this._invokeNativeObject(1, null, String.class);
System.out.println(result);
COMUtils.checkRC(new HRESULT(result));
}
}
}
com.sun.jna.platform.win32.COM.COMException: класс не зарегистрирован( HRESULT: 80040154)
После компиляции и регистрации DLL я проверил наличие GUID в редакторе реестра. DLL была скомпилирована с x86 и любым процессором, но ни один из них не работал.
У меня было другое решение, которое не удалось, когда я попытался сначала загрузить библиотеку, объявить интерфейс с методом с тем же именем, что и в C#, но не получил такого исключения метода.
Как я могу устранить это исключение?
Подробнее здесь: https://stackoverflow.com/questions/792 ... registered