お世話になっております。Internet Explrer で利用するActiveX コントロール(MFC) を作成しています。
次のようなコードで、DoPropExchange 関数内でURLDownloadToCacheFileを利用してキャッシュに読み込んだ画像ファイルを、OnDrawで表示させようとしています。CMyCtrl クラス(コントロールのクラス) には CString m_CacheFileName のメンバー変数を定義してあり、ダウンロード後にファイルパスを格納し、これをOnDraw側で読み出して利用します。
// CMyCtrl には、メンバー変数 CString m_CacheFileName; が定義されています。
void CMyCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: 永続属性を持つ各カスタム プロパティ用の PX_ 関数を呼び出します。
CString targetUrl = _T("http://www.example.com/sample.jpg"); // 例
CString cacheFileName;
if (FAILED(URLDownloadToCacheFile(
GetControllingUnknown(),
targetUrl,
cacheFileName.GetBuffer(MAX_PATH),
MAX_PATH,
0,
NULL)))
{
m_CacheFileName.Empty();
}
else
{
m_CacheFileName = cacheFileName.GetBuffer();
for (int ii = 0; ii < 10; ii++)
{
if (::PathFileExists(cacheFileName))
break;
MessageBox(_T("Wait please."));
}
}
}
void CMyCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
if (!m_CacheFileName.IsEmpty())
{
MessageBox(m_CacheFileName));
if (!PathFileExists(m_CacheFileName))
{
MessageBox(_T("NG (unknown reason)."));
}
// そのほかの処理
}
}
上記コード例で、HTMLに埋め込んで表示させると、MessageBox(_T("Wait please.")); は一度も表示されず、MessageBox(_T("NG (unknown reason)."));が表示されます。
Microsoft(Sysinternals)謹製のProcessMonitorでモニタリングすると、Internet Explorer ではロードを完了しているのですが、その直後に taskhost.exe (親プロセスはservices.exe)によって、SetDispositionInformationFileが呼び出されて、せっかく読み込んだファイルをキャッシュから消してしまいます。
ウイルス対策ソフトを停止させてみましたが、変化ありません。
消されないようにしたいのですが、設定またはダウンロードするコード上の箇所に問題があるのか、呼び出し方に問題があるのか、IEの設定なのか、解決方法を知りたく思います。
IEのキャッシュ設定で、キャッシュを残さない設定などにしておらず、現に他のキャッシュファイルはキャッシュフォルダに多数あります。
ご存知の方ご教示のほどお願いいたします。