0

一部のコードを 32 ビット VBA から 64 ビット VBA にアップグレード中です。InterlockedIncrement 関数を使用します。

Private Declare PtrSafe Function InterlockedIncrement Lib "kernel32" (ByRef Addend As Long) As Long

これは、以前は kernel32 によってエクスポートされていましたが、x86 呼び出し元に対してのみです。64 ビット Excel から実行するのはそれほど単純ではありません。「 kernel32 で DLL エントリ ポイント InterlockedIncrement が見つかりません」というエラーが表示されます。理由は次のとおりです。

64 ビット ウィンドウでは、これらは実際の関数ではありません [...] 代わりにコンパイラの組み込み関数です。その関数を P/Invoking するコードは、Interlocked マネージ クラスを使用する必要があります。

良い代替手段は何ですか/これを修正できますか?


コンテキストとして、InterlockedIncrement と InterlockedDecrement を使用して COM 参照カウントを行うSO のこの回答からコードを更新しています。これらの Interlocked 関数は、マルチスレッドにとって重要なアトミック操作であることを理解しましたが、VBA はシングル スレッド アパートメントで実行されるため、気にする必要はありますか? this.refCount = this.refCount + 1十分ですか?コードは私の頭の少し上にあるので、これらの機能を忘れてバグが発生しないと 100% 確信することはできませんが、いずれかの方法でお知らせください。

4

1 に答える 1