はじめまして、とよしまです。

> ・Visual C++ で, ある DLL の関数から別の DLL の関数にオープ
>   ンされたファイルポインタを渡して入出力できない真の理由は何
>   か? それをできるようにするにはどうすればよいか

/MDを付けずにコンパイルした場合、標準ライブラリはシングルスレッド
を想定したものとなっています。これらは、状態を保持するために
一部グローバル変数などを利用していると思われます。が、それぞれのDLL
が標準ライブラリをスタティックにリンクしているために、グローバル変数
がそれぞればらばらに保持されてしまっていると思います。このため、
FILE*を渡してもお互いの状態に不整合が生じて正しく処理できないのでは
ないでしょうか。また、もしグローバル変数などが使われてなく、
FILE構造体のなかにすべてのワークが収まっていたとしても、それぞれの
DLLが利用しているライブラリが異なれば、当然FILE構造体の中身も異なる
こととなり、不整合が起きると思います(ライブラリの違いはシングル
スレッドかマルチスレッドか、デバッグ版かリリース版か、また開発環境
の違いなどから当然起こるでしょう)。ということで、FILE*を渡すという
仕様自体に問題があると思います。代替案としてファイルディスクリプタ
を渡すというのでは駄目でしょうか?
int fd = _fileno(fp);
として得たfdを渡し、受け取った側では
FILE *fp = _fdopen(fd);
としてFILE*に戻します(ただし、当然、f*系関数の状態は引き継げません)。

 -・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・〜・-
   とよしまハウス            http://www.tk.xaxon.ne.jp/~toyoshim/
   Hotmail解析中!  http://www.tk.xaxon.ne.jp/~toyoshim/gates/hotmail.htm
                   ------------------------------------------------------
                        とよしま@エースネット ai7t-tysm / asahi-net.or.jp
                                        とよしま toyoshim / tk.xaxon.ne.jp
                                       ==================================