如何通过ColdFusion 9从COM对象中检索safearray(of struct)

时间:2013-02-12 17:34:43

标签: com coldfusion coldfusion-9 safearray createobject

我试图引用定义为:

的COM对象方法
IEdmFile7::GetDerivedBOMs  
Returns the derived (a.k.a. "named" or "saved") bills of materials associated with this file.  
Prototype:

HRESULT GetDerivedBOMs( [out,ref] SAFEARRAY ( struct EdmBomInfo ) *ppoBoms );

我在edmFile变量中引用了IEdmFile7对象。

当我<cfdump var="#edmFile#">时,该方法可见:

Method: GetDerivedBOMs([out]USERDEFINED, [out, retval]VOID)

当我尝试调用该方法时(尝试传递了许多不同的param类型):

<cfset edmFile.GetDerivedBOMs(???)>

AutomationException: Member not found出错。我只能假设它没有正确识别或投射参数。如何正确地将对safearray(of struct)的引用传递给方法?

(根据评论编辑)

我尝试过的一些例子:

 <cfset myObject = createObject("java","java.lang.Object").init()> 
 <cfset myArray = arrayNew(1)> 
 <cfset myRefArrayOfObjects = javaCast("java.lang.Object[]", myArray)> 
 <cfset myResultArray = edmFile.GetDerivedBOMs(myRefArrayOfObjects)> 

结果:

 Member Not Found Description: Automation Exception: Member Not Found 

评论的另一次尝试:

<cfset myArray = ArrayNew(1)> 
<cfset myArray = edmFile.GetDerivedBOMs()> 

结果:

There are no methods with the specified method name and argument types. 
Check your function and retry 

1 个答案:

答案 0 :(得分:1)

不幸的是,这是一个.net互操作限制。来自CF文档

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec13e1a-7fd4.html

  • 您不能使用指针作为参数或返回来调用方法 类型。
  • 您无法调用取出参数的方法。

在这种情况下,您将使用类型为safearray的变量的byref地址[指针]命中它们,它将创建并作为OUT参数返回给您。

在这种情况下,我发现更容易创建一个.net类来“包裹”它,以充当一个中介,解决CF在这方面遇到的问题。