none
OleLoadPicturePathのLPOLESTRの扱い方 RRS feed

  • 質問

  • visual studio 2008 MFC(ダイアログベース)を使っています。

    jpeg画像表示をやってみようと思い、ネットの受け売りを使って

    h_result = ::OleLoadPicturePath(  _T("C:\\Sample.jpg"), NULL, 0, 0, IID_IPicture, (void**)&pic );

    というようなことやっています。このあとの処理を行えばちゃんと、画像が表示されるのでこれはこれで問題有りません。しかし、ファイル名をソースコードに直に書き込むのは現実的ではなく、変数定義にしたいと思っています。

    ただ、1番目の引数をFilenameという変数にして

    h_result = ::OleLoadPicturePath(  Filename, NULL, 0, 0, IID_IPicture, (void**)&pic );

    というようなことをやると、result にエラーが返ってきてしまいます。ビルドエラーは出ずに実行もできるのですが、返ってくるエラーはどうも、PST_E_NO_PERMISSIONS のようです。

    Filenameは、

    TCHAR   *tcrFullPath = _T("C:\\Sample.jpg"),;

    h_result = ::OleLoadPicturePath( T2OLE(tcrFullPath), NULL, 0, 0, IID_IPicture, (void**)&pic );

    です。

    OleLoadPicturePathの第一引数を、_T("C:\\Sample.jpg")のような直定義ではなく変数Filenameで定義するには、何型でどう扱うのが一番、分かりやすいですか?素人にもとっつきやすい方法をご教授頂ければ幸いです。

    最終的には、

    CFile OpenPicFile; 

    OpenPicFile.GetFilePath(); で得られる文字列(CString型)を出発点に、OleLoadPicturePathの第一引数に渡せる型へ持っていきたいと思っています。

    よろしくお願いします。

    2010年12月15日 12:31

回答

  • もう少し、事実関係を整理して頂けませんか?

    h_result = ::OleLoadPicturePath(  _T("C:\\Sample.jpg"), NULL, 0, 0, IID_IPicture, (void**)&pic );

    これは成功しているという認識で問題ないですか?

    h_result = ::OleLoadPicturePath(  Filename, NULL, 0, 0, IID_IPicture, (void**)&pic );

    というようなことをやると、result にエラーが返ってきてしまいます。ビルドエラーは出ずに実行もできるのですが、返ってくるエラーはどうも、PST_E_NO_PERMISSIONS のようです。

    これは CFile OpenPicFile; と組み合わせた最終形で失敗しているという認識で問題ないですか?

    TCHAR   *tcrFullPath = _T("C:\\Sample.jpg"),;
    h_result = ::OleLoadPicturePath( T2OLE(tcrFullPath), NULL, 0, 0, IID_IPicture, (void**)&pic );

    このブロックは、実は簡略化していて、これだけを取り出して実行した場合は成功すると言うことはないですか?

     

    間をすっ飛ばした予想ですが、CFile で排他アクセスしている状態で、OleLoadPicturePath を実行しようとしていませんか?
    CFile でほかから開けない状態にしているのであれば、NO_PERMISSIONS と言われても仕方ないと思います。
    (排他しない共用アクセスにするか、そもそも、必要がないのであれば CFile で開かないようにするか)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク AnalogTerebi 2010年12月16日 10:51
    2010年12月15日 14:10
    モデレータ

すべての返信

  • もう少し、事実関係を整理して頂けませんか?

    h_result = ::OleLoadPicturePath(  _T("C:\\Sample.jpg"), NULL, 0, 0, IID_IPicture, (void**)&pic );

    これは成功しているという認識で問題ないですか?

    h_result = ::OleLoadPicturePath(  Filename, NULL, 0, 0, IID_IPicture, (void**)&pic );

    というようなことをやると、result にエラーが返ってきてしまいます。ビルドエラーは出ずに実行もできるのですが、返ってくるエラーはどうも、PST_E_NO_PERMISSIONS のようです。

    これは CFile OpenPicFile; と組み合わせた最終形で失敗しているという認識で問題ないですか?

    TCHAR   *tcrFullPath = _T("C:\\Sample.jpg"),;
    h_result = ::OleLoadPicturePath( T2OLE(tcrFullPath), NULL, 0, 0, IID_IPicture, (void**)&pic );

    このブロックは、実は簡略化していて、これだけを取り出して実行した場合は成功すると言うことはないですか?

     

    間をすっ飛ばした予想ですが、CFile で排他アクセスしている状態で、OleLoadPicturePath を実行しようとしていませんか?
    CFile でほかから開けない状態にしているのであれば、NO_PERMISSIONS と言われても仕方ないと思います。
    (排他しない共用アクセスにするか、そもそも、必要がないのであれば CFile で開かないようにするか)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク AnalogTerebi 2010年12月16日 10:51
    2010年12月15日 14:10
    モデレータ
  • Azuleanさん、有難うごます。どうやら予想されたとおりだったようです。 

    h_result = ::OleLoadPicturePath(  _T("C:\\Sample.jpg"), NULL, 0, 0, IID_IPicture, (void**)&pic );

    これは成功しているという認識で問題ないですか?

    h_result = ::OleLoadPicturePath(  Filename, NULL, 0, 0, IID_IPicture, (void**)&pic );

    というようなことをやると、result にエラーが返ってきてしまいます。ビルドエラーは出ずに実行もできるのですが、返ってくるエラーはどうも、PST_E_NO_PERMISSIONS のようです。

    これは CFile OpenPicFile; と組み合わせた最終形で失敗しているという認識で問題ないですか?

    TCHAR   *tcrFullPath = _T("C:\\Sample.jpg"),;
    h_result = ::OleLoadPicturePath( T2OLE(tcrFullPath), NULL, 0, 0, IID_IPicture, (void**)&pic );

    このブロックは、実は簡略化していて、これだけを取り出して実行した場合は成功すると言うことはないですか

     現象は、御理解いただいているとおりで間違えありません。

    もともと私がネット上で見つけたサンプルプログラムでは、パスを含むファイル名の文字列バッファが、wchar_t path_wchar[MAX_PATH+1]; で定義されていました。これをそのままコピペしたところ、PST_E_NO_PERMISSIONSが出たため、その後の検討の過程の中で、TCHAR  *tcrFullPath = _T("C:\\Sample.jpg")というようなことをやってみたのですが、同じエラーがが出てきました。そのあとで、
    http://msdn.microsoft.com/ja-jp/library/805c56f8(VS.80).aspx
    という情報にたどり着き、質問投稿に載っけたソースコードのようになっています。ということで、現在はファイルパス名とファイル名を表す文字列をTCHARで扱おうと考えています。 それと、昨日の投稿には書き間違えがあり、ファイル名を _T("C:\\Sample.jpg"); と書いていたのですが、実際のソースコードではハイフンを含む、_T("C:\\Sample-1.jpg");というファイル名で書いていました。

     

    間をすっ飛ばした予想ですが、CFile で排他アクセスしている状態で、OleLoadPicturePath を実行しようとしていませんか?
    CFile でほかから開けない状態にしているのであれば、NO_PERMISSIONS と言われても仕方ないと思います。
    (排他しない共用アクセスにするか、そもそも、必要がないのであれば CFile で開かないようにするか)  

    当初は、 CFile::modeReadという状態になっていました。
    上記のような設定だったものに非排他を定義するように、
      CFile::modeRead | CFile::shareDenyNone
    というように書き換えたうえで、Azuleanさんのおっしゃった
     TCHAR   *tcrFullPath = _T("C:\\Sample.jpg");
    という定義をしたところ、エラーが出ずに画像表示ができるようになりました。CFile::shareExclusiveではないので排他ではないと思っていましたが、CFile::shareDenyNoneを明示的に定義しない場合は排他と同じ扱いだったようですね。(何も指定しないと、排他扱いになるようですね)

    あと、投稿時には書き間違えていたのですが、ファイル名にハイフンが入っていたのも悪さをしていたようです。 上記のとおり、昨日の投稿には、_T("C:\\Sample.jpg"); と書いていたのですが、実際のソースコードでは_T("C:\\Sample-1.jpg");というファイル名で書いていました。

    2010年12月16日 10:50