DLL内の関数にファイルポインタを渡すとハングアップする そんな時の原因と対策

WindowsでS/W開発をする際にはまっている人がいたのでメモしておきます。

DLL内の関数にファイルポインタを渡した際、突如ハングアップをすることがあります。

ハングアップする原因

原因はこれです。
DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー

簡単に言うと、アプリケーションとDLLで違うランタイムライブラリを使っている場合、ファイルポインタなどのCRTオブジェクトを渡すことは出来ないんです。

アプリケーションやDLLが使っているランタイムライブラリを調べるには、Process Explorerが便利です。
Process Explorer

試しに、アプリケーションをVisual C++ 2010で、DLLをVisual C++ 2008で作ったものを実行し、Process Explorerで調べてみると

msvcr90.dll MicrosoftR C Runtime Library Microsoft Corporation ・・・ msvcr100.dll MicrosoftR C Runtime Library Microsoft Corporation ・・・

と表示されました。

両方をVisual C++ 2010で作った場合は

msvcr100.dll MicrosoftR C Runtime Library Microsoft Corporation ・・・

だけでした。 ※全て/MDでビルドしています。詳細は前述のMicrosoftの資料を読んでください

前者ではアプリケーションとDLLでCTRオブジェクトを受け渡して処理することが出来ません。正確には、CRTオブジェクトの受け渡しは出来ますが、それを使うことが出来ません。

例えば、アプリケーションでfopenしたファイルポインタをDLLに渡し、書き込みや読み込みをしようとするとハングアップしてしまいます。

ただし、渡すだけなら大丈夫です。DLL側でfopenしたファイルポインタをアプリケーションには渡すが、アプリケーションからはファイル操作を行わず、全てDLL側に渡して処理するという構成にすればOKです。

後者の場合は、アプリケーションでfopenしたファイルポインタを用いてDLL側からでもファイル操作可能です。

こんな症状に出くわしたら参考にしてください。