доступ к COM объектам
От: shestero  
Дата: 24.01.07 12:41
Оценка: 3 (1)
Я пытаюсь обратиться к COM из Java-ы, используя http://j-interop.sourceforge.net
Кто-нибудь использовал эту библиотеку или может дельно прокомментировать возможность вызова COM/DCOM из Java-ы без JNI?
Проблема в том, что я не могу заставиь её работать. Вот мой код (написан на базе примера):
public class test2 {
 public static void main(String[] args)
 {
    System.out.println("Hello");
     JIComServer comServer = null;
     try {
         JISession session = JISession.createSession(
                 "localhost",
                 "administrator",
                 "");
         System.out.println("(1)");
         comServer = new JIComServer(JIProgId.valueOf(session,"Excel.Application"),"127.0.0.1",session);
         System.out.println("(2)");
         IJIUnknown unknown = comServer.createInstance();
         System.out.println("(3)");
         IJIDispatch dispatch = (IJIDispatch)ComFactory.createCOMInstance(
                 ComFactory.IID_IDispatch,
                 (IJIComObject)unknown);
         System.out.println("(4)");
         IJITypeInfo typeInfo = dispatch.getTypeInfo(0);
         System.out.println("(5)");
         FuncDesc funcDesc = typeInfo.getFuncDesc(0);
         System.out.println("(6)");
         int dispId = dispatch.getIDsOfNames("Visible");
         System.out.println("(7)");
         JIVariant variant = new JIVariant(Boolean.TRUE);
         System.out.println("(8)");
         dispatch.put(dispId,variant);
     } catch (JIException e) {
         System.out.println("JIException cought!");
         System.out.println(e.getMessage());
         e.printStackTrace();
     } catch (UnknownHostException e) {
         System.out.println("UnknownHostException cought!");
         System.out.println(e.getMessage());
         e.printStackTrace();
     }
    System.out.println("Bye");
 }
}

На двух машинах он даёт JIException с сообщением "internal error", на третей — с сообщением "Unable to access Windows Registry, please check whether the SERVER service is running on the Target Workstation. [0x00001031]". Есть подозрение, что я просто не сумел должным образом настроить access permission к DCOM компонентам. Локальный сервис "Server" у меня запущен... Или я чего не понимаю. Кто-нибудь встечал подобные траблы?
"D:\Program Files\Java\jdk1.5.0\bin\java" -Xdebug -Xrunjdwp:transport=dt_socket,address=shestero-xp:1468,suspend=y,server=n -Dfile.encoding=windows-1251 -classpath "D:\Program Files\Java\jdk1.5.0\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\jce.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\rt.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.5.0\jre\lib\ext\sunpkcs11.jar;D:\j2workplace\workspace1\jinterop_test2\classes;D:\j2workplace\j-Interop\lib\ncacn_ip_tcp.jar;D:\j2workplace\j-Interop\lib\iwombat.jar;D:\j2workplace\j-Interop\lib\ncacn_np.jar;D:\j2workplace\j-Interop\lib\jcifs-ntlm-auth.jar;D:\j2workplace\j-Interop\lib\jarapac.jar;D:\j2workplace\j-Interop\lib\j-interop.jar;D:\j2workplace\j-Interop\lib\jcifs-1.2.9.jar;D:\j2workplace\j-Interop\lib\ntlm-security.jar;D:\IntelliJ-IDEA-4.5\lib\idea_rt.jar" test2
Hello
Log file will be created in user's home directory, incase of Windows OS it will be "C:\Documents and Settings\username\Local Settings\Temp\j-Interop0.log"
(1)
progIdVsClsidDB: {}

JIException cought!
Unable to access Windows Registry, please check whether the SERVER service is running on the Target Workstation. [0x00001031]
org.jinterop.dcom.common.JIException: Unable to access Windows Registry, please check whether the SERVER service is running on the Target Workstation. [0x00001031]
    at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKLM(JIWinRegStub.java:85)
    at org.jinterop.dcom.core.JIProgId.getIdFromWinReg(JIProgId.java:109)
    at org.jinterop.dcom.core.JIProgId.getCorrespondingCLSID(JIProgId.java:142)
    at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:131)
    at test2.main(test2.java:19)
Caused by: jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password.
....
В качестве domain я пробовал localhost, 127.0.0.1, имя в сети микрософт и пустую строку, в качестве user — "administrator", "Administrator", имя пользователя и пустую строку. Пароль у меня пустой.
У меня английская XP sp2.
PS Моя конечная цель — написание несложного OPC-клиента на Java-е. Существует ли сейчас какой-нибудь аналог Utgard-а ( http://openscada.org/UtgardProject )? Кто-нибудь его использовал? Крайне нехочется прибегать к JNI...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.