◀ANSI版開発トップへ
  • 1740 CMemory::GetPtrとGetPtr2を整理
    • 4038 RE: ツールバーが化ける件
      • 4039 Re2: ツールバーが化ける件
      • 4041 Re2: ツールバーが化ける件
      • 4043 Re2: ツールバーが化ける件
  • [1740] CMemory::GetPtrとGetPtr2を整理 やざき 2002年03月17日 15:24

    紛らわしいので、GetPtr2をGetPtrに改名しましょう。
    すると、こうなります↓

    CMemory::GetPtr( int* )
    CMemory::GetPtr()

    で、現状GetPtr( NULL )と呼んでいるところは、GetPtr()に書き換えましょう。

    とりあえずそれだけ。
    • [4038] RE: ツールバーが化ける件 みく 2005年09月08日 18:25


      えっと、再現環境ないので未確認ですが、99%これだと思われる箇所が
      見つかりました。

      SHGetDesktopFolder()を使ってますが、これをReleaseするタイミング
      が間違っています。
      正しくは、ITEMIDLISTを解放した後です。

      etc_uty.cpp:
      CreateItemIDList
      DeleteItemIDList
      GetLongFileName

      これで解決するといいな。
      • [4039] Re2: ツールバーが化ける件 げんた 2005年09月08日 23:23

        CreateItemIDList, DeleteItemIDListはGetLongFileNameからのみ使われているようなので,
        新たなGetLongFileNameとして作り直した方がいいかも.

      • [4041] Re2: ツールバーが化ける件 げんた 2005年09月10日 09:41

        これって何処に記述があるんでしょうか.
        Platform SDKのShell Programmer's guideのところを読んでもそれらしい記述が見つかりませんでした.
      • [4043] Re2: ツールバーが化ける件 げんた 2005年09月10日 14:12

        Platform SDKによればGetLongPathName()がWindows 98/2000以降では使用可能で,
        NT/95ではNewAPIs.hをインクルードすることで使えるようになるとあります.
        NewApis.hではGetLongPathName()を関数ポインタに置き換えて,OSのバージョンによってKernel32の関数かエミュレーション関数かを設定するようになっています.

        今ある関数は全部やめてそれをそのまま使う方が間違いも起きず良いのではと思います.

        ちなみにNewApis.hを見ると,Shellを介する手法は同じですがSetLastErrorとかより忠実にエミュレーションしている感じです.

        最初は判定関数を呼ぶようにポインタをセットしておき,初回呼び出し時にOSの判定を行ってポインタを書き換えるという手法は他にも応用できるかも.

        ---
        以上を入れたのがブリーフケースのGetLongPathName.diffです.

        注意: 古いSDKだとNewAPIs.hにバグがあってコンパイルエラーになります.
        Probe_GetLongPathName()の
        DWORD (CALLBACK *RealGetLongPathName)(LPCTSTR, LPTSTR, DWORD);
        のDWORDがBOOLになっています.