2009-06-04 123 views
2

我遇到了COM組件可見的問題,並且調用了VB6中的某些方法。 我發現的是,如果參數是明確定義的類型(例如字符串),則調用工作正常。如果它們是更高級別的對象,則會引發運行時錯誤「438」,表明屬性或方法不存在。我懷疑這是一個在呼叫中擁有正確簽名的問題,但我無法看到如何正確執行此操作。在VB6中,如何調用需要指向對象的指針的COM對象?

我相信我已經在.NET方面做了一切正確的事情(ComVisible,公共接口等,甚至把它放在一個簡單的例子中)。從類型庫查看器的輸出

看,我有以下幾點:

dispinterface ISimple { 
properties: 
methods: 
    [id(0x60020000)] 
    void Add([in] ISimpleMember* member); 
    [id(0x60020001)] 
    ISimpleMember* Create(); 
}; 

確定。所以我在我的ISimple接口中有兩種方法。一個需要一個ISimpleMember(Add),而另一個則返回一個ISimpleMember。

VB中的相應代碼如下所示:

Dim item As ISimpleMember 
Dim simple As simple 
Set item = New SimpleMember 
item.S1 = "Hello" 
item.S2 = "World" 
Set simple = New simple 
simple.Add (item)   <---- This raised the run time error 438 
Set item = simple.Create <---- This works fine, returning me an ISimpleMember 

我已經試過幾件事情:1。 昏暗的項目作爲SimpleMember(沒有區別) 2. simple.Add(ObjPtr(項)) - 語法錯誤 3. simple.Add(爲ByRef項目) - 語法錯誤

基本上,運行時間錯誤是一樣的,如果我有 simple.AMethodThatIHaventWritten()

還有,如果我瀏覽在VB6環境引用,Add方法是明確界定:

減少添加(成員作爲SimpleMember)

回答

2

我發現我相信答案。這很簡單: 當調用子例程時,我不應該把名字放在大括號中。通話應該是:

simple.add member 

而不是

simple.add(member) 

如果我將其更改爲一個功能(即返回一個值,而不是無效)括號是必要的

這似乎是工作

+0

您是否從下面的代碼中看到了這個想法? :-) – ichiban 2009-06-04 22:56:05

0

(可能)現在主要以C#,Javascript等代碼開發的前3個VB6編碼錯誤是: -

  1. 在行的末尾放置;。它的一個語法錯誤很容易被發現並拿起編譯器。
  2. 未將Then置於If條件表達式的另一端。它又是一個語法錯誤。
  3. 在不檢索值的情況下調用方法,但使用()來包含參數列表。有了多個參數,這是一個語法錯誤,很容易找到。只有一個參數,()的使用被解釋爲一個表達式。它是作爲參數傳遞的()表達式的結果。當被調用者期望ByRef時,這會導致問題。