Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT与COM的互操作-将float[]放入变量中?_Java_Activex_Swt_Com Interop_Ole - Fatal编程技术网

Java SWT与COM的互操作-将float[]放入变量中?

Java SWT与COM的互操作-将float[]放入变量中?,java,activex,swt,com-interop,ole,Java,Activex,Swt,Com Interop,Ole,在我的JavaSWT应用程序中,我托管了一个第三方ActiveX控件。我用OleClientSite来做这个 // Ah, this works. :-) OleAutomation comObject = new OleAutomation(...); 我想从Java调用两个简单的小函数。以下是COM函数定义: [id(5)] void easyFoo([in] int blah); [id(20)] void problemFoo([in] VARIANT floatArray); 简

在我的JavaSWT应用程序中,我托管了一个第三方ActiveX控件。我用OleClientSite来做这个

// Ah, this works. :-)
OleAutomation comObject = new OleAutomation(...);
我想从Java调用两个简单的小函数。以下是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?]);

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

我怀疑没有接受float[]的构造函数,因为s没有float数组成员

我认为你需要做的是将你的浮动打包成一个(我不知道如何用Java创建一个)

或者,您可以尝试将数组序列化为原始位,并使用VARIANT struct的BYTE*成员,然后传递一个包含字节计数的int,这样您就可以在另一端准确地反序列化(我假设这都在同一进程和线程中,否则会变得更困难)


创建变量数组并用浮点数组值填充它有什么错

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

对于(int i=0;i您需要传递一个float数组。在COM术语中,这意味着将vt设置为vt|R4 | vt|u数组时是a。变量数组可能无法工作,因为文档没有说明它可以接受变量数组(vt|u VARIANT | vt|u数组)。在java中,您应该能够使用float[]作为参数类型。如果不是,则始终可以。

相同的进程、相同的线程,但没有问题foo(字节、字节数).COM对象是一个第三方控件,它只接受变量,文档中说明您应该传入一个浮点数组。好的,希望这个或其他答案能为您指明正确的方向。也许可以联系供应商,询问他们是否有一些Java示例代码。供应商不再支持此COM组件,因此我无法获得支持我们正试图摆脱第三方控制,但这些事情需要时间我将调查byte*成员。如果这样做有效,我会将您的标记为正确答案。好的,另一端的控件将需要某种特定类型。它应该拒绝在变量的vt字段中未指定该类型的任何内容。最简单的方法是附加一个调试器(VS或NTSD)并逐步完成函数调用的反汇编。控件在何处进行比较应该非常明显,您可以立即知道它是否需要SAFEARRAY或什么。Jeff,您可以向我提供哪些资源来准确解释如何进行此操作?我非常精通Java和.NET的调试器,但当调试本机代码。谢谢,我没有想到我可以发送一个变体数组。我会尝试一下,然后再给你回复。关于SAFEARRAY,我认为我不需要SAFEARRAY,因为COM IDL会指定何时需要,对吗?我已经看到需要SAFEARRAY的函数IDL;这个特定的IDL说明我需要一个变体。无论如何,我会e这些是一个尝试,然后回复给你。事实上,现在我不太确定;它实际上可能是一个安全数组。Hrmmm。传入一个变量数组似乎不起作用。在实际代码中,problemFoo需要2个参数,都是浮点数组。我将尝试执行一个安全数组,然后回复给你。感谢你的反馈。我只是添加了一条注释,解释我发现了什么(我没有找到)关于SAFEARRAY的内容。刚刚添加了另一个对Java项目的引用,该项目操作了
SAFEARRAY
。这可能会有所帮助。@Juda:“
VARIANT
”的问题是它可能是任何东西。但是,如果是SAFEARRAY,您是否签出了?谢谢您的回答。我已经看到了您链接到的Java文章中的“读取和写入安全数组”。我已将该代码改编为适用于浮点的代码,它似乎可以工作。我将很快发布结果。
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;