2010-08-18 122 views
0

我試圖通過使用類似obj.Do("text")的代碼來訪問COM方法,而Do是obj中的方法,它需要ref string作爲其輸入(obj是.COM對象,寫入在VB6中)。但是它總是拋出一個COMException類型不匹配。我嘗試通過obj.Do(ref a)而a是一個字符串變量,但它也沒有工作。COMException:嘗試訪問COM方法時出現類型不匹配

VB代碼看起來像這樣

Function Generate(sDestinationFile As String) 
    .... 
Exit Function 

你知道是什麼原因造成這一點,我應該怎麼解決呢?

+0

錯誤可能是'obj',而不是字符串參數?或者可能參數被識別並且調用已成功編組,但是vb6代碼中發生異常? – MarkJ 2010-08-18 12:19:56

回答

1

VB6 cls是什麼樣子的?

例如,像這樣的東西似乎工作作爲一個快速測試。

VB6 CLS命名stringMe.cls:

Dim someString As String 

Function AddString(ByRef someString) 
    AddString = "Hello " & someString 
End Function 

我編這是一個ActiveX DLL。

在C#中,我加入到DLL的引用和編碼:

static void Main(string[] args) 
{ 
    StringMe sm = new StringMe(); 
    object inVar = "world!"; 
    string returnVar = sm.AddString(ref inVar).ToString(); 
    System.Console.WriteLine(returnVar); 
} 
+0

編輯,以顯示代碼看起來像 – 2010-08-19 01:56:45

+0

@Louis,我已經嘗試了幾個傳遞byref或不使用,在VB6代碼中使用不同的功能簽名等組合。每個人都按預期工作,我不能重現你的錯誤。我傾向於@MarkJ說的東西,那個例外是VB6中的一個地方。我沒有想法。 – Mark 2010-08-19 13:27:56

+0

也許你是對的..非常感謝你的努力,我給你一個upvote – 2010-08-19 15:35:41

0

有了您的VB6組件,請確保您有拋開,使每一個二進制兼容性參考DLL編譯生成與dll相同的DispID,否則.Net項目的Interop將不會引用正確的方法。

請記住,當您添加方法等後重新編譯VB6組件時,您需要爲.Net項目生成一個新的Interop。

在tlbimp中使用命令行參數以確保您具有一致的Interop,而不是您在選擇向COM組件添加引用時生成的默認值。

相關問題