3

VB6 アプリケーション用に作成された COM サーバーを置き換えようとしています。

ソースコードにはアクセスできません。

何らかの理由で、VB6 アプリはコンストラクターを呼び出すことができますが、次のようになります。

システム エラー &H80004002。そのようなインターフェースはサポートされていません。

QueryInterface でインターフェイスを取得しようとするときを想定しています。

regasm /tlb と gacutil を介してアセンブリを適切に送信しましたが、奇妙なことに気付きました。アセンブリ用に生成された .tlb ファイル regasm を開くと、インターフェイスのすべてのプロパティがメソッドとして表示されることに気付きました。

これは .Net ツールが行っていることですか? そして、これは私の問題を引き起こしますか?

元のファイルの完全な tlb 定義は次のとおりです。

// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: UtopiaKeyboard.tlb

[
  uuid(9B4E1840-FF65-11CF-AA2E-0020AFA49D5A),
  version(1.0),
  helpstring("OPOS POSKeyboard OLE Control")
]
library POSKEYBOARDLib
{
    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("STDOLE2.TLB");

    // Forward declare all types defined in this typelib
    dispinterface _DPOSKeyboard;
    dispinterface _DPOSKeyboardEvents;

    [
      uuid(9B4E1841-FF65-11CF-AA2E-0020AFA49D5A),
      helpstring("Dispatch interface for OPOS POSKeyboard OLE Control"),
      hidden
    ]
    dispinterface _DPOSKeyboard {
        properties:
            [id(0x00000001)            
]
            BSTR CheckHealthText;
            [id(0x00000002)            
]
            VARIANT_BOOL Claimed;
            [id(0x00000003)            
]
            VARIANT_BOOL DataEventEnabled;
            [id(0x00000004)            
]
            VARIANT_BOOL DeviceEnabled;
            [id(0x00000005)            
]
            VARIANT_BOOL FreezeEvents;
            [id(0x00000006)            
]
            long ResultCode;
            [id(0x00000007)            
]
            long ResultCodeExtended;
            [id(0x00000008)            
]
            long State;
            [id(0x00000009)            
]
            BSTR ControlObjectDescription;
            [id(0x0000000a)            
]
            long ControlObjectVersion;
            [id(0x0000000b)            
]
            BSTR ServiceObjectDescription;
            [id(0x0000000c)            
]
            long ServiceObjectVersion;
            [id(0x0000000d)            
]
            BSTR DeviceDescription;
            [id(0x0000000e)            
]
            BSTR DeviceName;
            [id(0x0000000f)            
]
            long POSKeyData;
            [id(0x0000001a)            
]
            VARIANT_BOOL AutoDisable;
            [id(0x0000001b)            
]
            long BinaryConversion;
            [id(0x0000001c)            
]
            long DataCount;
            [id(0x0000001d)            
]
            VARIANT_BOOL CapKeyUp;
            [id(0x0000001e)            
]
            long EventTypes;
            [id(0x0000001f)            
]
            long POSKeyEventType;
            [id(0x00000021)            
]
            long CapPowerReporting;
            [id(0x00000022)            
]
            long PowerNotify;
            [id(0x00000023)            
]
            long PowerState;
        methods:
            [id(0x00000010)]
            long Open([in] BSTR DeviceName);
            [id(0x00000011)]
            long Close();
            [id(0x00000012)]
            long Claim([in] long Timeout);
            [id(0x00000013)]
            long Release();
            [id(0x00000014)]
            long CheckHealth([in] long Level);
            [id(0x00000015)]
            long ClearInput();
            [id(0x00000016)]
            long DirectIO(
                            [in] long Command, 
                            [in, out] long* pData, 
                            [in, out] BSTR* pString);
            [id(0x00000017)]
            void SOData([in] long Status);
            [id(0x00000018)]
            void SODirectIO(
                            [in] long EventNumber, 
                            [in, out] long* pData, 
                            [in, out] BSTR* pString);
            [id(0x00000019)]
            void SOError(
                            [in] long ResultCode, 
                            [in] long ResultCodeExtended, 
                            [in] long ErrorLocus, 
                            [in, out] long* pErrorResponse);
            [id(0x00000020)]
            long SOProcessID();
            [id(0x00000024)]
            void SOStatusUpdate([in] long Status);
    };

    [
      uuid(9B4E1842-FF65-11CF-AA2E-0020AFA49D5A),
      helpstring("Event interface for OPOS POSKeyboard OLE Control")
    ]
    dispinterface _DPOSKeyboardEvents {
        properties:
        methods:
            [id(0x00000001)]
            void DataEvent([in] long Status);
            [id(0x00000002)]
            void DirectIOEvent(
                            [in] long EventNumber, 
                            [in, out] long* pData, 
                            [in, out] BSTR* pString);
            [id(0x00000003)]
            void ErrorEvent(
                            [in] long ResultCode, 
                            [in] long ResultCodeExtended, 
                            [in] long ErrorLocus, 
                            [in, out] long* pErrorResponse);
            [id(0x00000004)]
            void StatusUpdateEvent([in] long Status);
    };

    [
      uuid(9B4E1843-FF65-11CF-AA2E-0020AFA49D5A),
      helpstring("OPOS POSKeyboard OLE Control"),
      control
    ]
    coclass POSKeyboard {
        [default] dispinterface _DPOSKeyboard;
        [default, source] dispinterface _DPOSKeyboardEvents;
    };
};

これは、私の .Net アセンブリの生成 tlb です。

// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: POSKEYBOARDLib.tlb

[
  uuid(9B4E1840-FF65-11CF-AA2E-0020AFA49D5A),
  version(1.0),
  custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "POSKEYBOARDLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5824208931aaf68b")

]
library POSKEYBOARDLib
{
    // 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 _DPOSKeyboard;
    dispinterface _DPOSKeyboardEvents;

    [
      uuid(9B4E1841-FF65-11CF-AA2E-0020AFA49D5A),
      version(1.0),
      custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "POSKEYBOARDLib._DPOSKeyboard")    

    ]
    dispinterface _DPOSKeyboard {
        properties:
        methods:
            [id(0x00000001), propget]
            BSTR CheckHealthText();
            [id(0x00000001), propput]
            void CheckHealthText([in] BSTR rhs);
            [id(0x00000002), propget]
            VARIANT_BOOL Claimed();
            [id(0x00000002), propput]
            void Claimed([in] VARIANT_BOOL rhs);
            [id(0x00000003), propget]
            VARIANT_BOOL DataEventEnabled();
            [id(0x00000003), propput]
            void DataEventEnabled([in] VARIANT_BOOL rhs);
            [id(0x00000004), propget]
            VARIANT_BOOL DeviceEnabled();
            [id(0x00000004), propput]
            void DeviceEnabled([in] VARIANT_BOOL rhs);
            [id(0x00000005), propget]
            VARIANT_BOOL FreezeEvents();
            [id(0x00000005), propput]
            void FreezeEvents([in] VARIANT_BOOL rhs);
            [id(0x00000006), propget]
            long ResultCode();
            [id(0x00000006), propput]
            void ResultCode([in] long rhs);
            [id(0x00000007), propget]
            long ResultCodeExtended();
            [id(0x00000007), propput]
            void ResultCodeExtended([in] long rhs);
            [id(0x00000008), propget]
            long State();
            [id(0x00000008), propput]
            void State([in] long rhs);
            [id(0x00000009), propget]
            BSTR ControlObjectDescription();
            [id(0x00000009), propput]
            void ControlObjectDescription([in] BSTR rhs);
            [id(0x0000000a), propget]
            long ControlObjectVersion();
            [id(0x0000000a), propput]
            void ControlObjectVersion([in] long rhs);
            [id(0x0000000b), propget]
            BSTR ServiceObjectDescription();
            [id(0x0000000b), propput]
            void ServiceObjectDescription([in] BSTR rhs);
            [id(0x0000000c), propget]
            long ServiceObjectVersion();
            [id(0x0000000c), propput]
            void ServiceObjectVersion([in] long rhs);
            [id(0x0000000d), propget]
            BSTR DeviceDescription();
            [id(0x0000000d), propput]
            void DeviceDescription([in] BSTR rhs);
            [id(0x0000000e), propget]
            BSTR DeviceName();
            [id(0x0000000e), propput]
            void DeviceName([in] BSTR rhs);
            [id(0x0000000f), propget]
            long POSKeyData();
            [id(0x0000000f), propput]
            void POSKeyData([in] long rhs);
            [id(0x00000010)]
            long Open([in] BSTR DeviceName);
            [id(0x00000011)]
            long Close();
            [id(0x00000012)]
            long Claim([in] long Timeout);
            [id(0x00000013)]
            long Release();
            [id(0x00000014)]
            long CheckHealth([in] long Level);
            [id(0x00000015)]
            long ClearInput();
            [id(0x00000016)]
            long DirectIO(
                            [in] long Command, 
                            [in, out] long* pData, 
                            [in, out] BSTR* pString);
            [id(0x00000017)]
            void SOData([in] long Status);
            [id(0x00000018)]
            void SODirectIO(
                            [in] long EventNumber, 
                            [in, out] long* pData, 
                            [in, out] BSTR* pString);
            [id(0x00000019)]
            void SOError(
                            [in] long ResultCode, 
                            [in] long ResultCodeExtended, 
                            [in] long ErrorLocus, 
                            [in, out] long* pErrorResponse);
            [id(0x0000001a), propget]
            VARIANT_BOOL AutoDisable();
            [id(0x0000001a), propput]
            void AutoDisable([in] VARIANT_BOOL rhs);
            [id(0x0000001b), propget]
            long BinaryConversion();
            [id(0x0000001b), propput]
            void BinaryConversion([in] long rhs);
            [id(0x0000001c), propget]
            long DataCount();
            [id(0x0000001c), propput]
            void DataCount([in] long rhs);
            [id(0x0000001d), propget]
            VARIANT_BOOL CapKeyUp();
            [id(0x0000001d), propput]
            void CapKeyUp([in] VARIANT_BOOL rhs);
            [id(0x0000001e), propget]
            long EventTypes();
            [id(0x0000001e), propput]
            void EventTypes([in] long rhs);
            [id(0x0000001f), propget]
            long POSKeyEventType();
            [id(0x0000001f), propput]
            void POSKeyEventType([in] long rhs);
            [id(0x00000020)]
            long SOProcessID();
            [id(0x00000021), propget]
            long CapPowerReporting();
            [id(0x00000021), propput]
            void CapPowerReporting([in] long rhs);
            [id(0x00000022), propget]
            long PowerNotify();
            [id(0x00000022), propput]
            void PowerNotify([in] long rhs);
            [id(0x00000023), propget]
            long PowerState();
            [id(0x00000023), propput]
            void PowerState([in] long rhs);
            [id(0x00000024)]
            void SOStatusUpdate([in] long Status);
    };

    [
      uuid(9B4E1842-FF65-11CF-AA2E-0020AFA49D5A),
      version(1.0),
      custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "POSKEYBOARDLib._DPOSKeyboardEvents")    

    ]
    dispinterface _DPOSKeyboardEvents {
        properties:
        methods:
            [id(0x00000001)]
            void DataEvent([in] long Status);
            [id(0x00000002)]
            void DirectIOEvent(
                            [in] long EventNumber, 
                            [in, out] long* pData, 
                            [in, out] BSTR* pString);
            [id(0x00000003)]
            void ErrorEvent(
                            [in] long ResultCode, 
                            [in] long ResultCodeExtended, 
                            [in] long ErrorLocus, 
                            [in, out] long* pErrorResponse);
            [id(0x00000004)]
            void StatusUpdateEvent([in] long Status);
    };

    [
      uuid(9B4E1843-FF65-11CF-AA2E-0020AFA49D5A),
      version(1.0),
      custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "POSKEYBOARDLib.POSKeyboard")
    ]
    coclass POSKeyboard {
        interface _Object;
        [default] dispinterface _DPOSKeyboard;
        [default, source] dispinterface _DPOSKeyboardEvents;
    };
};

どういうわけか私のプロパティはメソッドとしてリストされています... PreserveSig を追加しても、プロパティにする代わりに 2 つのメソッドを書き込みます。

元の tlb と同じにするには、どのような変更を試みる必要がありますか? または、少なくともそれを機能させます。

更新: イベント インターフェイスに DispIdAttribute がない場所が見つかりました。それを修正しましたが、VB6 アプリはまだ同じエラーで失敗します。

4

3 に答える 3

2

IUnknownメソッド名 (QueryInterface、AddRef、およびRelease ) と重複する名前を持つ COM インターフェイスを持つことはできません。

アップデート

C# クラスでディスパッチフェイス (つまり、OLE オートメーション バインディング用の IDisptach インターフェイス) を生成するには、クラスをClassInterfaceAttributeで装飾します。

[ClassInterface(ClassInterfaceType.AutoDispatch)]
class myClass
{
   public string Foo {get;}
   public long Bar();
}

これにより、生の COM インターフェイスではなく、自動化プロパティ Foo とメソッド Bar が生成されます。

于 2009-10-23T17:04:25.560 に答える
1

リンクに含まれる情報を使用しようとしたことがあります:
Visual Basic: TypeLib 情報オブジェクト ライブラリを使用した COM コンポーネントの検査

[編集] tlbimp.exeツールが役立つ
かどうかを確認してください。

于 2009-10-23T17:13:20.690 に答える
0

さて、私はそれを理解しました...

ターゲット アプリで vb6 デコンパイラを使用して逆コンパイルし、vb6 プロジェクトとしてエクスポートしました。

VS 2008 で開き、VB .Net にアップグレードしました。

アプリケーションを実行すると、「IOleObject にキャストできません」というエラーが表示されました。

Google検索を行ったところ、System.Windows.Forms.Controlこのインターフェースを実装していることがわかったので、から継承しControlて問題を修正しました。

于 2009-10-26T21:27:26.773 に答える