2009-03-21 27 views
1

次のC#クラスを考える:VB6:直接型「オブジェクト」のプロパティを設定できません

namespace ComTest 
{ 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    [Guid("A1D11BE5-40A1-4566-A1CA-418ABC76017C")] 
    public interface IThing 
    { 
     [DispId(1)] 
     void SetValue(object input); 
     [DispId(2)] 
     object Value {get; set;} 
    } 

    [ComVisible(true)] 
    public class Thing: IThing 
    { 
     internal object PValue; 

     public void SetValue(object input) 
     { 
      PValue = input; 
     } 

     public object Value 
     { 
      get 
      { 
       return PValue; 
      } 
      set 
      { 
       PValue = (object)value; 
      } 
     } 

    } 
} 

誰もがVB6で、次の行動を説明できますか?

Dim oThing as Thing 
Dim input as Variant, output as Variant 
input = "Some text" 
Set oThing = new Thing 
oThing.SetValue(input) ' works fine 
output = oThing.Value  ' works fine 
Set oThing.Value = input ' fails with runtime error '424': Object required 

[新] 私は、COM-見えるようにアセンブリを設定し、プロジェクトのプロパティは、(タブの構築)、「COM相互運用機能に登録する」と記されたボックスにチェック。

私が使用している実際のクラスの最小限の縮小版です。実際のクラスとThingクラス(下記)のTLB情報を比較しました。 **のマークが付いた行は、Thingクラスには存在しますが、実際のクラスでは見つかりません(実際のコクラスには[デフォルト] dispinterface IThingが含まれています)プロパティはもはやオートコンプリートされません。(2)コントリビュータが見つけたときにValueへの直接割り当てが機能するようになりました。何かご意見は?

// Generated .IDL file (by the OLE/COM Object Viewer) 
// 
// typelib filename: ThingLib.tlb 
[ 
    uuid(92093AA7-870E-498A-8B80-97545D221E24), 
    version(1.0), 
    helpstring("AAA Testing COM interop") 
] 
library ThingLib 
{ 
    // TLib :  // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D} 
    importlib("mscorlib.tlb"); 
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} 
    importlib("stdole2.tlb"); 

    // Forward declare all types defined in this typelib 
    dispinterface IThing; 
** interface _Thing; 

    [ 
     uuid(7FC255DD-F82F-4B39-8755-9680A97033B5), 
     version(1.0), 
     custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "ComTest.IThing")  

    ] 
    dispinterface IThing { 
     properties: 
     methods: 
      [id(0x00000001)] 
      void SetValue([in] VARIANT input); 
      [id(0x00000002), propget] 
      VARIANT Value(); 
      [id(0x00000002), propputref] 
      void Value([in] VARIANT rhs); 
    }; 

    [ 
     uuid(D96FB9C7-A0AF-35D3-A0F6-A07A9ED47984), 
     version(1.0), 
     custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "ComTest.Thing") 
    ] 
    coclass Thing { 
**  [default] interface _Thing; 
     interface _Object; 
     dispinterface IThing; 
    }; 

** [ 
**  odl, 
**  uuid(C309BDD0-239F-38AA-A057-254F8E01BD4B), 
**  hidden, 
**  dual, 
**  oleautomation, 
**  custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "ComTest.Thing")  
** ] 
** interface _Thing : IDispatch { 
** }; 
}; 

答えて

1

ジェレミー(私はVB6をインストールしていないので、私はエクセルVBAを使用しますが)、私はあなたのコードを試してみましたが、それが正常に動作します。そこ

object Value (get; set;) 

object Value {get; set;} 

する必要がありますあなたのコードのタイプミスですが、私はそれはそれはあなたのコンパイルエラーを与える必要がありますので、ごエラーとは何かを持っていることを疑います。ここに入れたコードを正確に試しましたか?

0

VB6クライアントでCOMインターフェイスの実装を問題なく行ってみました(ただし、Valueプロパティに記載されているtypo Jakobは例外です)。

5
にコードを変更し

Dim oThing as Thing 
Dim input as Variant, output as Variant 
input = "Some text" 
Set oThing = new Thing 
oThing.SetValue(input) ' works fine 
output = oThing.Value  ' works fine 
Set oThing.Value = input ' Change this line 

、すべてが動作するはずです。 VB6でオブジェクトを設定する必要があります。 オブジェクトをアトミック型に対してのみ実行できます。

+0

私は与えたコードが正しく機能していますが(誤植を訂正しても)、コピーした元のクラスはまだ動作しません。オリジナルとカットダウンの例のCOM(TLB)情報の違いについて私の編集された質問を参照してください - 私は違いを引き起こしたものを把握することはできません。 –

関連する問題