8

在我的 Java SWT 应用程序中,我托管了一个第 3 方 ActiveX 控件。我正在使用 OleClientSite 来执行此操作。

// Ah, this works. :-)
OleAutomation comObject = new OleAutomation(...);

我想从 Java 调用 2 个简单的小函数。以下是 COM 函数定义:

[id(5)]
void easyFoo([in] int blah);

[id(20)]
void problemFoo([in] VARIANT floatArray);

容易,对吧?这是我的假装代码:

// Ah, this works. :-)
OleAutomation comObject = new OleAutomation("Some3rdPartyControlHere");

// Call easyFoo(42). This works. :-)
int easyFooId = 5;
comObject.invoke(easyFooId, new Variant[] { new Variant(42) });

// Call problemFoo(new float[] { 4.2, 7.0 }). This doesn't work. :-(
int problemFooId = 20;
comObject.invoke(problemFooId, [ACK! What goes here?]);

问题在最后一行:如何将浮点数组传递给第 3 方 COM 对象?帮助!

4

3 回答 3

1

您需要传递一个浮点数组。在 COM 术语中,这意味着vt 设置为 VT_R4|VT_ARRAY 的 VARIANT 变体数组可能不起作用,因为文档没有说它可以接受变体数组 (VT_VARIANT |VT_ARRAY)。在 java 中,您应该能够使用 float[] 作为参数类型。如果不是,您总是可以调用 Windows API 来构造所需类型的安全数组

于 2009-10-24T21:21:13.983 回答
0

我怀疑没有构造函数采用 float[] 因为VARIANT没有 float 数组成员。

我认为你需要做的就是把你的花车打包成一个SAFEARRAY(ick;我不知道如何在 Java 中创建一个)。

或者,您可以尝试将数组序列化为原始位并使用 VARIANT 结构的 BYTE* 成员,并传递一个具有字节数的 int ,以便您可以在另一端准确地反序列化(我假设这就是全部在同一个进程和线程中,否则会变得更难)。

[id(20)]
void problemFoo([in] VARIANT bytes /* VT_BYREF|VT_UI1 */, [in] VARIANT byteCount /* VT_UI4 */);
于 2009-08-22T22:21:21.330 回答
0

创建一个 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;

如果简单的方法不起作用并且您确实需要 SAFEARRAY,您可以尝试在示例“读取和写入 SAFEARRAY ”之后创建一个,使用org.eclipse.swt.internal.win32.OS. 但这似乎char[]只是。

创建相关 SAFEARRAY 的其他灵感来源:

SafeArray项目 com4j的类(及其关联的类,如Variant

于 2009-08-23T08:56:06.530 回答