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
...