2013-02-12 62 views
1

檢索(的結構)從COM對象SAFEARRAY我試圖引用定義爲一個COM對象的方法:如何通過的ColdFusion 9

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(的結構體)?

(編輯從評論)

什麼,我已經嘗試了一些例子:

<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

如果您可以向我們顯示您嘗試過的調用和參數以及每個產生的錯誤,這將有所幫助。你有沒有嘗試用你的例子設置一個變量?像'',然後轉儲'edmResult'變量。 – 2013-02-12 21:09:03

+0

在重讀您的示例時,爲什麼要將任何內容傳遞給該方法? safearray參數僅被標記爲輸出。對?所以,你是否試過'然後''然後轉儲'myArray'變量。 – 2013-02-12 21:24:06

+0

Miguel-F:我嘗試過所有可能的事情,我無法發佈em全部...您的建議(即然後)返回:「There沒有指定方法名和參數類型的方法檢查你的函數,然後重試「 – 2013-02-13 20:42:56

回答

1

不幸的是這是一個.NET互操作程序限制。從CF文檔

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

  • 不能調用與指針作爲參數或者返回 類型的方法。
  • 您不能調用取出參數的方法。

在這種情況下,您將同時創建一個類型爲safearray的變量的byref地址[指針],並將它作爲OUT參數創建並返回給您。

在這樣的情況下,我發現創建一個.net類可以更容易地「圍繞」這個角色,充當一個媒介,解釋CF在這個過程中遇到的問題。