SHCreateStreamOnFileでコンパイルエラー

[戻る]
mac 2006/07/18(火) 11:12:37
いつも参考にさせていただいております、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

Blue 2006/07/18(火) 11:28:13
どうも、VC6のshlwapi.hではSHCreateStreamOnFileの関数宣言がないっぽいです。
(VC6SP6 Enterで確認)

しかしながら、shlwapi.dll にはちゃんとSHCreateStreamOnFileA(W)が定義されていま
すので、面倒ですがLoadLibrary+GetProcAddressで対応するとか。

Blue 2006/07/18(火) 11:48:21
こんなサイト見つけた。

ファイルからストリーム(IStream)を作成
http://www.wac-jp.com/programmers/win32/SHCreateStreamOnFile.html
※SHCreateStreamOnFileと同等の関数を自作する関数


多分、VC6対応の一番最終の Platform SDKを入れれば、このような面倒なことはしなく
てもよさそう。どれをどのようにインストールするかはよくわかりませんし、必ず
SHCreateStreamOnFileが対応しているとも言い切れませんので。

Blue 2006/07/18(火) 13:41:14
> 面倒ですが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);

mac 2006/07/18(火) 19:44:57
[[解決]]
Blue様、回答ありがとうございます。

Blue様にの上記サンプルを参考に作成した結果、問題なくファイルを
出力できました。
ありがとうございました。

古いスレッドには追加発言できません。