0

我有一个我试图调用的 COM 方法,其中有一个“对象”类型的参数,它必须是一个 2D 双安全数组,一个纬度/经度点的集合。如何在 JACOB 中创建 SafeArray 以通过 COM 接口发送?

我尝试将二维数组作为对象列表中的对象传递。该方法不返回错误,但我在 FalconView 中看不到预期的结果(多边形的渲染)。

    double polyPoints[][] = new double[5][2];
    polyPoints[0][0] = 75.3;
    polyPoints[0][1] = 4.5;     
    polyPoints[1][0] = 3.8;
    polyPoints[1][1] = 4.8;
    polyPoints[2][0] = 2.3;
    polyPoints[2][1] = 2.5;
    polyPoints[3][0] = 5.3;
    polyPoints[3][1] = 6.5;
    polyPoints[4][0] = 0.3;
    polyPoints[4][1] = -1.5;

// Can't recreate Variant or SafeArray from double[x][y] array;

    Object[] polygonArgs = new Object[] {m_mainLayerHandle, polyPoints, 1};
    Variant returnAddPolygon = Dispatch.invoke(mainLayerDispatch, "AddPolygon", Dispatch.Method, polygonArgs,  new int[1]);
    System.out.println("Polygon Handle: " + returnAddPolygon.getInt());

    Object[] refreshArgs = new Object[] {m_mainLayerHandle};
    Variant refreshVariant = Dispatch.invoke(mainLayerDispatch, "Refresh", Dispatch.Method, refreshArgs,  new int[1]);

第二个arment文档:

lat_lon_array 双精度的二维 SAFEARRAY。第一个维度包含纬度值。第二个维度包含经度值

4

1 回答 1

0

似乎 SafeArray 使用一些不太清楚的构造函数支持 1 维、2 维和 N 维数组。鉴于我在上面创建的二维双数组,我能够将数据复制到二维双安全数组中。预先创建 double[][] 肯定会更有效,但我在一些原型代码中这样做。可能有办法将整个数组复制到安全数组中……我不确定。

// 2D array of type double. First dimension size 5, second dimemnsion size 2.
SafeArray safeArray = new SafeArray(Variant.VariantDouble, 5, 2);
for(int i = 0; i < 5; i++) {
    for (int j = 0; j < 2; j++) {
            // set the value of safearray[i][j] to value polyPoints[i][j]
        safeArray.setDouble(i, j, polyPoints[i][j]);
    }
}
于 2013-08-26T17:22:58.580 回答