JNA получает com.sun.jna.platform.win32.COM.COMException: класс не зарегистрированC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 JNA получает com.sun.jna.platform.win32.COM.COMException: класс не зарегистрирован

Сообщение Anonymous »

Я пытаюсь проверить возможность вызова COM, скомпилированного из C#, в приложении Java с использованием JNA.
Код 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";
}
}
}
И код Java:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»