0

COM初心者です。既存の COM サーバーを新しい機能で拡張するタスクがあります。既存のメソッドの拡張または書き換えは正常に機能しますが、数値を返す新しいメソッドを追加しましたが、ポインターの場所に単純な値を書き込むと例外 (0xC0000005: アクセス違反の書き込み場所...) が発生します。既存の方法と全く同じです。その中のブレークポイントが機能しているので、新しいメソッドが実行されます。私は何を間違っていますか?サーバー スタブが新しい​​メソッドにメモリを割り当てていないようです。サーバー メソッドをテストするクライアントは、C# で記述されています。サーバーとテスト クライアントは同じマシンで実行されます。

.idl ファイル:

[id(19)] HRESULT GetLoggingLevel
(
    [out, retval] long* Level
);
[id(190)] HRESULT GetLoggingLevelNew
(
    [out, retval] long* Level
);

COM サーバーの .cpp ファイル:

STDMETHODIMP DeviceControl::GetLoggingLevel(LONG * Level)
{
    *Level = 43; // works
    return S_OK;
}
STDMETHODIMP DeviceControl::GetLoggingLevelNew(LONG * Level)
{
    *Level = 42; // acces violation writing location [Level]
    return S_OK;
}

テストクライアントの Form1.cs

private void Form1_Load(object sender, EventArgs e)
{
    m_deviceControl = new MechLib.DeviceControl();
    int foo = m_deviceControl.GetLoggingLevel(); // foo = 43
    int bar = m_deviceControl.GetLoggingLevelNew(); // server crashes
    ...
4

1 に答える 1

1

COM インターフェイスを変更した場合は、それに新しい GUID を割り当てる必要があります。そうしないと、インターフェイスに間違ったプロキシ/スタブが使用される可能性があり、これはおそらく新しいメソッドに何の影響も与えません...

于 2013-11-05T10:05:46.653 に答える