2013-08-26 1 views
0

У меня есть COM-метод, который я пытаюсь вызвать, где есть аргумент типа «объект», который должен быть двумерным двойным безопасным массивом, набором точек lat/long. Как я могу создать SafeArray в JACOB для отправки через интерфейс COM?Передача аргумента 2D Array с JACOB

Я пробовал просто передать 2D-массив как объект в списке объектов. Метод не возвращает ошибку, но я не вижу ожидаемых результатов в 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]); 

Вторая arument документация:

lat_lon_array двухмерное SAFEARRAY двойников. Первое измерение содержит значения широты. Второй размер содержит значения долготы

ответ

0

Кажется, что SafeArray поддерживает 1 размерный, 2-мерный и N-мерный массивы с использованием некоторых несколько нечетких конструкторов. Учитывая двумерный массив 2D, который я создал выше, я смог скопировать данные в двумерный двойной безопасный массив. Конечно, было бы более эффективно создавать двойной [] [] фронт, но я делаю это в коде прототипа. Могут быть способы скопировать все массивы в безопасный массив ... Я не уверен.

// 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]); 
    } 
}