いつも参考にさせていただいております、macと申します。
早速質問ですが、msxml4.dllを用いて、XMLファイルを出力する
アプリケーションを作成しております。
XMLファイルを出力する際、IStreamPrtを用いて
以下のように出力しようと考えております。
IStreamPtr pStream;
SHCreateStreamOnFile(C:\\output.xml,
STGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_CREATE,
&pStream);
IMXWriterPtr pWriter;
:
pWriter->put_output(_variant_t((IUnknown*)(IUnknownPtr)pStream));
そこで、SHCreateStreamOnFileを用いてIStreamPtrを取得したいのですが、
「'SHCreateStreamOnFile' : 定義されていない識別子です。」
というコンパイルエラーが返ってきてしまいます。
ウェブ上でいろいろ調べて、関数「SHCreateStreamOnFile」を
使用するために「shlwapi.h」をincludeするまでは分かったのですが
#include <shlwapi.h>と記載しても、プロジェクトの設定ダイアログから
インクルードしても、結果は変わりませんでした。
どのように設定すれば良いのでしょうか?
どなたかご教授お願いいたします。
開発環境
Windows XP
VC++ 6.0
どうも、VC6のshlwapi.hではSHCreateStreamOnFileの関数宣言がないっぽいです。
(VC6SP6 Enterで確認)
しかしながら、shlwapi.dll にはちゃんとSHCreateStreamOnFileA(W)が定義されていま
すので、面倒ですがLoadLibrary+GetProcAddressで対応するとか。
こんなサイト見つけた。
ファイルからストリーム(IStream)を作成
http://www.wac-jp.com/programmers/win32/SHCreateStreamOnFile.html
※SHCreateStreamOnFileと同等の関数を自作する関数
多分、VC6対応の一番最終の Platform SDKを入れれば、このような面倒なことはしなく
てもよさそう。どれをどのようにインストールするかはよくわかりませんし、必ず
SHCreateStreamOnFileが対応しているとも言い切れませんので。
> 面倒ですがLoadLibrary+GetProcAddressで対応するとか。
一応試してみました。うまく動いてはいるようです。
(try句)
IStreamPtr pStream;
HMODULE hDll=LoadLibrary(TEXT(shlwapi.dll));
if (hDll!=NULL)
{
// WINAPIは必要ないかも。
typedef HRESULT (WINAPI *SHCREATESTREAMONFILE)(LPCSTR,DWORD,IStream**);
SHCREATESTREAMONFILE pSHCreateStreamOnFile;
// ~A の方を取得
pSHCreateStreamOnFile=
(SHCREATESTREAMONFILE)GetProcAddress(hDll,TEXT(SHCreateStreamOnFileA));
hr=pSHCreateStreamOnFile(test.xml,
STGM_READWRITE|STGM_SHARE_DENY_WRITE|STGM_CREATE,
&pStream);
FreeLibrary(hDll);
}
else
{
// 適当
hr=S_FALSE;
}
// エラーをスロー
if (FAILED(hr)) _com_issue_error(hr);
Blue様、回答ありがとうございます。
Blue様にの上記サンプルを参考に作成した結果、問題なくファイルを
出力できました。
ありがとうございました。