もらったソースを修正していたら、「メモリがロックされています。」とかいう例外エラーが発生して落ちる。
なんでだろうと思って調べてみると、C++で作成されている関数呼び出しで落ちているっぽい。
原因
C++のソースを追いかけてみると、以下のような処理があった。
SafeArrayAccessData(buff, *p);
if (buff != ret)
{
return -1;
}
SafeArrayUnaccessData(buff);
SafeArrayAccessDataでメモリをロックした後に、条件分岐で抜けており、ロックが放置されていた状態だった。
以下のように修正。
SafeArrayAccessData(buff, *p);
if (buff != ret)
{
SafeArrayUnaccessData(buff);
return -1;
}
SafeArrayUnaccessData(buff);
単純なロック周りの不具合だったけど、C++あまり触らないのでパッと分からず…。
SAFEARRAYについて、ちゃんと理解しておこうと思った。