2013-01-25 81 views
3

Visual Studio 2008(C#)爲我的COM對象創建了Interop。我正在使用的主要對象是:OPCHDAServerClass,IOPCHDAItemsOPCHDAItem。的代碼是:無法將對象...投射到

OPCHDAServerClass server = new OPCHDAServerClass(); 
server.Connect("OPC.PHDServerHDA.1"); 
OPCHDAItem item = server.OPCHDAItems.AddItem("MyItem",1); 

在第三行中的AddItem方法應該返回一個OPCHDAItem。對於AddItem互操作的定義是:

[DispId(1610743813)] 
OPCHDAItem AddItem(string ItemID, int ClientHandle); 

,我得到的唯一的例外是:

無法投類型的對象OPCHDAServerClass爲鍵入「IOPCHDAItems」。

我不明白爲什麼我收到此錯誤消息。 server.OPCHDAItems實施IOPCHDAItems。我不知道爲什麼服務器(OPCHDAServerClass)正在轉換爲IOPCHDAItems

我在python中進行了初始原型設計,工作正常,所以我知道COM組件是功能性的。這是python代碼:

server = win32com.client.dynamic.Dispatch("Uniformance.OPCHDA.Automation.1") 
server.Connect("OPC.PHDServerHDA.1") 
item = server.OPCHDAItems.AddItem("MyItem", 1) 

有沒有人看到類似的問題,並知道工作?

+0

你說這是你在做peudo代碼,但你是什麼實際的代碼?另外,OPCHDAServerClass實際上是否有一個名爲OPCHDAItems的屬性? – user1610015

+0

避免使用以「Class」結尾的類型名稱。它們是COM服務器中實際不存在的合成類型,在某些情況下可能會導致此類問題。嘗試新增OPCHDAServer或IOPCHDAServer –

+0

您可以介入生成的COM嗎? – silverjam

回答

0

貌似聲明類型的財產OPCHDAItemsIOPCHDAItems - 這是OPCHDAServerClass。 C#是一種靜態類型化語言 - 除非明確告知,否則不會指定COM接口,除非告知該接口,否則它不會用於IDispatch。另一種方式是這樣的:

server.Connect("MyServerName"); 
OPCHDAItem item = (server.OPCHDAItems as IOPCHDAItems).AddItem("MyItem",1); 

編輯:先試試這個:

IOPCHDAItems Items = server.OPCHDAItems; 

仍是同樣的錯誤?怎麼樣

IOPCHDAItems Items = server.OPCHDAItems as IOPCHDAItems; 
+0

仍然是一樣的錯誤。它仍在嘗試投射OPCHDAServerClass。它表現得像無法訪問服務器對象內的對象。我可以使用簡單的數據類型訪問屬性,例如服務器中的int和string,但不能訪問另一個對象。 – zam664