動作環境
C++ Builder XE4 (またはVisual Studio Community 2017)
と某ライブラリ
とあるライブラリを使うソフトを開発中にはまった。
用意されたAPI(一部)
- XXX_Init()
- XXX_Open()
- XXX_Close()
- LoadLibrary()
- UnloadLibrary()
エラー発生条件
- XXX_Init()
- XXX_Open()
- XXX_Close()
- XXX_Init()
モジュール'ntdll.dll'のアドレスXXXでアドレスXXXに対する読取り違反がおきました。
エラーが起きない条件
- XXX_Init()
- XXX_Init()
- XXX_Init()
...
以下でもエラーは発生しない。
- XXX_Init()
- XXX_Open()
- XXX_Init()
- XXX_Open()
...
XXX_Close()の処理で何か問題があるようだ。
対処
案1 XXX_Init()は一回だけ実行する
XXX_Init()を複数回実行しないように上位ソフトを作成する。
それでいいかどうかは上位ソフトの仕様による。
案2 XXX_Init()前にUnloadLibrary()をする
- UnloadLibrary()
- LoadLibrary()
- XXX_Init()
- XXX_Open()
- XXX_Close()
- UnloadLibrary()
- LoadLibrary()
- XXX_Init()
...
上記にてエラーが出ないことを確認した。