質問させてください、
COM風のDLLを作ってるときに、
void IHOGE::Release()
{
  // あらかじめ保存しておいた、exe側のWinAPIのFreeLibrary()のアドレスと
  BOOL (WINAPI *fpFreeLibrary)(HMODULE) = m_fpFreeLibrary;
  // DLLのハンドルをローカル変数にコピーしてから、
  HMODULE hLibrary = m_hLibrary;
  // 自殺して
  delete this;
  // DLL解放
  fpFreeLibrary(hLibrary);
}

なんてやろうとしたんですが、DLL解放のところでバグってしまいました。

以前VC6でやっててうまくいってたんですが
(実行時にDLLの方がDLL解放の処理を書いてないバージョンのままだった可能性はあります・・・)
VC2005Expressでやるとダメでした。

こんなことせずに自前で解放すれば大丈夫なのですが、
DLLから得た関数の中でDLLを解放することはそもそも原理的にダメなのでしょうか?
そのあたりの理屈が知りたいので、よろしければ教えてください。