2

私は現在保留中の質問を開いていました-しかし、それに取り組んだ後、私は新しい問題に遭遇し、それを構築しようとしたときに私が得たエラーは次のとおりでした:

Error   1   error C2695: 'MyEventsSink::OnSomethingHappened': overriding virtual function differs from 'Library::IEventsSink::OnSomethingHappened' only by calling convention   
Error   2   error C2695: 'MyEventsSink::SomeTest': overriding virtual function differs from 'Library::IEventsSink::SomeTest' only by calling convention 

このエラーについてゴーグルを試みましたが、理解できませんでした。

これが私がしていることです。ネイティブC++アプリケーションによって消費されているマネージドC#dllクラスライブラリがあります。C#インターフェイスのコードは次のとおりであり、このインターフェイスの実装はC++で行われます。

C#コードは

[ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("fdb9e334-fae4-4ff5-ab16-d874a910ec3c")]
    public class IEventsSinkImpl : IEventsSink
    {
        public void OnSomethingHappened()
        {
            //Doesnt matter what goes on here - atleast for now
        }

        public void SomeTest(IEventsSink snk)
        {
            //When this is called - it will call the C++ code
            snk.OnSomethingHappened();
        }
    }//end method

そして、C++でのその実装コードは

class MyEventsSink : public Library::IEventsSink
{
public:
    MyEventsSink() {}
    ~MyEventsSink() {}

    virtual HRESULT OnSomethingHappened()
    {
        std::cout << "Incredible - it worked";
    }

    virtual HRESULT SomeTest(IEventsSink* snk)
    {
        //Doesnt matter this wont be called
    }

};

どうやらビルドプロセス中にVS2010は上記のエラーについて不平を言っています。これらのエラーを解決する方法についての提案。

4

1 に答える 1

3

__stdcall呼び出し規約を使用してみてください:

virtual HRESULT __stdcall OnSomethingHappened()

通常、C ++は__cdecl呼び出し規約を使用します。この規則では、呼び出し元は呼び出し後にスタックからパラメーターを削除します。COMを含むほとんどのWindowsAPI関数__stdcallは、呼び出し先がスタックからパラメーターを削除する場所を使用します。

明らかに、仮想関数をオーバーライドする場合、関数呼び出しは実行時に解決されるため、両方の関数の呼び出し規約は同じである必要があります。

于 2013-03-16T10:16:25.870 に答える