Java SWT interop с COM - помещение плавания [] в Вариант?

Существует большая разница между статическими функциями в C и статическими функциями членства в C++. В C статическая функция не видима за пределами своей единицы перевода, которая является объектным файлом, в который это компилируется. Другими словами, делая функциональные помехи пределами его объем. Можно думать о статической функции, как являющейся "частным" в ее *.c файл (хотя это не строго корректно).

В C++, "статичном", может также относиться к функциям членства и элементам данных классов. Статический элемент данных также называют "переменной класса", в то время как нестатический элемент данных является "переменной экземпляра". Это - терминология Smalltalk. Это означает, что существует только одна копия статического элемента данных, совместно использованного всеми объектами класса, в то время как каждый объект имеет свою собственную копию нестатического элемента данных. Таким образом, статический элемент данных является по существу глобальной переменной, которая является членом класса.

Нестатические функции членства могут получить доступ ко всем элементам данных класса: статичный и нестатичный. Статические функции членства могут только воздействовать на статические элементы данных.

Один способ думать об этом состоит в том, что в C++ статические элементы данных и статические функции членства не принадлежат никакому объекту, но всему классу.

8
задан 12 revs 14 October 2009 в 03:26
поделиться

3 ответа

Вам необходимо передать массив с плавающей запятой. В терминах COM это означает sa VARIANT с vt, установленным на VT_R4 | VT_ARRAY. Массив вариантов может не работать, поскольку в документе не сказано, что он может принимать массив вариантов (VT_VARIANT | VT_ARRAY). В java вы должны иметь возможность использовать float [] в качестве типа параметра. Если нет, вы всегда можете вызвать Windows API, чтобы построить безопасный массив желаемого типа .

1
ответ дан 6 December 2019 в 02:26
поделиться

Что не так с созданием массива Variant и заполнением его значениями массива с плавающей запятой?

Variant[] problemFooArgs = new Variant[myFloats.length]; 
for( int i=0; i<myFloats.length; i++)
{
        problemFooArgs[i] = new Variant(myFloats[i]);
}

Если действительно нужен только один аргумент (массив с плавающей запятой), вы можете попробовать один уровень косвенное обращение:

Variant[] problemFooArgs = new Variant[1]; 
Variant[] myFooArgs = new Variant[1]; 
for( int i=0; i<myFloats.length; i++)
{
        myFooArgs [i] = new Variant(myFloats[i]);
}
problemFooArgs[0] = myFooArgs;

Если простой подход не работает и вам действительно нужен БЕЗОПАСНЫЙ СРЕДСТВО, вы можете попытаться создать его после примера « Чтение и запись в БЕЗОПАСНЫЙ СРЕДСТВО », используя константы org.eclipse.swt.internal.win32.OS . Но, похоже, только для char [] .

Другой источник вдохновения для создания соответствующего SAFEARRAY:

класс SafeArray проекта com4j (и связанный с ним класс , как Вариант )

0
ответ дан 6 December 2019 в 02:26
поделиться

Я подозреваю, что не существует конструктора, который принимает float [], потому что VARIANT не имеют члена массива float.

Думаю, что вам нужно сделать чтобы выполнить эту работу, упакуйте свои поплавки в SAFEARRAY (ick; и я понятия не имею, как его создать на Java).

В качестве альтернативы вы можете попробовать сериализовать свой массив в необработанные биты и использовать член BYTE * структуры VARIANT и передать int, который имеет количество байтов, чтобы вы могли точно десериализовать на другой стороне (и я предполагаю, что все это находится в том же процессе и потоке, иначе это станет сложнее).

[id(20)]
void problemFoo([in] VARIANT bytes /* VT_BYREF|VT_UI1 */, [in] VARIANT byteCount /* VT_UI4 */);
0
ответ дан 6 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: