1

オープンオフィスに接続しようとするこのテストクラスがあります。

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)

この例外が発生する理由はわかりましたが、これを解決する方法については解決策がありません。

4

1 に答える 1

1

Windows では、WinSock ライブラリを使用する前に、プロセスによって明示的に初期化する必要があります。これはWSAStartup()通常、アプリの起動時に関数を使用して行われます。他のほとんどのプラットフォームでは、ソケット API 関数を使用する前にソケット ライブラリを明示的に初期化する必要はありません。Uno フレームワークは、Windows で実行する場合、これを内部的に処理する必要があります。そうでない場合は、フレームワークのバグと見なし、それに応じて作成者に報告する必要があります。しかし、宇野がこれを説明していない可能性は非常に低いと思います.

WSAStartup()回避策として、 Uno を使用する前に、コードで JNA を使用して手動で呼び出すことができます。

于 2015-06-19T17:02:10.637 に答える