2015-06-19 11 views
0

У меня есть этот тестовый класс, который пытается соединиться с открытым офисом.не удалось подключиться к сокету (WSANOTINITIALISED, WSAStartup() не был вызван) ошибка при запуске программы

import com.sun.star.bridge.XUnoUrlResolver; 
import com.sun.star.comp.helper.Bootstrap; 
import com.sun.star.lang.XMultiComponentFactory; 
import com.sun.star.lang.XMultiServiceFactory; 
import com.sun.star.uno.UnoRuntime; 
import com.sun.star.uno.XComponentContext; 

public class Test { 



    XMultiServiceFactory ooConnect() { 

     final String sConnectionString = "uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager"; 
     // create the initial component context 
     XComponentContext rComponentContext = null; 
     try { 
      rComponentContext = Bootstrap 
        .defaultBootstrap_InitialComponentContext(); 
     } catch (Exception e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 

     // retrieve the servicemanager from the context 
     XMultiComponentFactory rServiceManager = rComponentContext 
       .getServiceManager(); 

     Object objectUrlResolver = null; 
     try { 
      objectUrlResolver = rServiceManager.createInstanceWithContext(
        "com.sun.star.bridge.UnoUrlResolver", rComponentContext); 
     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     // Create a new url resolver 
     XUnoUrlResolver xurlresolver = (XUnoUrlResolver) UnoRuntime 
       .queryInterface(XUnoUrlResolver.class, objectUrlResolver); 

     XMultiServiceFactory rOfficeServiceManager = null; 
     try { 
      // resolve the uno-url 

      System.out.println("BLOCK 3"); 
      Object objectInitial = xurlresolver.resolve(sConnectionString); 

      rOfficeServiceManager = (XMultiServiceFactory) UnoRuntime 
        .queryInterface(XMultiServiceFactory.class, objectInitial); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return rOfficeServiceManager; 
     } 
     return rOfficeServiceManager; 
    } 




    public static void main (String [] args) 

    { 
     Test test = new Test(); 

     XMultiServiceFactory serviceFactory = test.ooConnect(); 
     if(serviceFactory != null) 
     { 
      System.out.println("YEYEYEYEY"); 
     } 
    } 
} 

Когда я пытаюсь запустить этот код, я становлюсь ниже исключения.

com.sun.star.connection.NoConnectException: Connector : couldn't connect to socket (WSANOTINITIALISED, WSAStartup() has not been called) 
     at com.sun.star.bridges.jni_uno.JNI_proxy.dispatch_call(Native Method) 
     at com.sun.star.bridges.jni_uno.JNI_proxy.invoke(JNI_proxy.java:171) 
     at com.sun.proxy.$Proxy3.resolve(Unknown Source) 
     at Test.ooConnect(Test.java:47) 
     at Test.main(Test.java:66) 

Теперь я понимаю, почему это исключение приходит, но я не получаю решение о том, как это разрешить.

+1

Umm .. вызов WSAStartup()? –

ответ

0

В Windows библиотека WinSock должна быть явно инициализирована процессом, прежде чем его можно будет использовать. Это делается с помощью функции WSAStartup(), как правило, при запуске приложения. Большинство других платформ не требуют явной инициализации библиотеки сокетов, прежде чем использовать функции API сокетов. Структура Uno должна обрабатывать это внутренне при работе в Windows. Если это не так, я бы подумал, что это ошибка структуры, и об этом следует сообщать автору. Но я считаю маловероятным, что Uno не учитывает это.

В качестве обходного пути вы можете использовать код JNA для вызова WSAStartup() вручную до использования Uno.

 Смежные вопросы

  • Нет связанных вопросов^_^