我试图引用定义为:
的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
答案 0 :(得分:1)
不幸的是,这是一个.net互操作限制。来自CF文档
http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec13e1a-7fd4.html
在这种情况下,您将使用类型为safearray的变量的byref地址[指针]命中它们,它将创建并作为OUT参数返回给您。
在这种情况下,我发现更容易创建一个.net类来“包裹”它,以充当一个中介,解决CF在这方面遇到的问题。