Я пытаюсь обратиться к 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...