ブログ移転しました。新しいサイトはこちらです。
http://eng-notebook.com/blog-entry-124/
1秒後に自動的にジャンプします。
  

  


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側からでもファイル操作可能です。


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



Sponsored Link


 
◆◇◆この記事が役に立ったらポチッとお願いします◆◇◆

 

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

おすすめ







 



カテゴリ