C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■96438 / 9階層)  フォルダーの選択ダイアログ
□投稿者/ Hongliang (1125回)-(2020/11/22(Sun) 22:06:22)
> ByRef ppszName As IntPtrのところも[MarshalAs(UnmanagedType.LPWStr)] を付けるとうまくいきました。
IntPtrには付けるべきではないです。
それはマネージ側がStringまたはStringBuilderであるときに指定するものなので。

> idlや itemも、CoTaskMemFreeした方が良いのでしょうか?
> もし、そうでないのであれば、
> FreeCoTaskMemした方が良い場合としなくても良い場合も教えていただけると幸いです。
解放する必要があるかどうかは、ドキュメントを見るのが一番です。
と言いつつ、SHILCreateFromPathには直接記載がないんですが。
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shilcreatefrompath
代わりにITEMIDLISTの方に解説があって、
https://docs.microsoft.com/en-us/windows/win32/api/shtypes/ns-shtypes-itemidlist
> PIDLIST_ABSOLUTE: The ITEMIDLIST is absolute and has been allocated, as indicated by its being non-constant. This means that it needs to be deallocated with ILFree when it is no longer needed. Because it is a direct pointer to allocated memory, it is aligned.
必要なくなればILFreeで解放する必要がある、と書かれています。

itemの方は、IShellItem型なのでそもそもIntPtrを要求するCoTaskMemFreeとは型が合わないですよね。
こっちはCOMのオブジェクトなので、解放はCOMの作法に従います。
COM的には、オブジェクトの所有者が、COMオブジェクトのReleaseメソッドの呼び出しをすることで所有権を放棄(参照カウントを減らす)していき、所有者がいなくなった(参照カウントが0になった)時点で解放される仕組みになっています。
.NETにおいては、基本的にはCOMオブジェクトは参照がなくなればGCによって暗黙にReleaseが呼び出され自動的に解放されます。なのであまり気にする必要はありません。
アウトオブプロセスCOMサーバの寿命を制御したい場合などで明示的に参照カウントを減らすには、Marshal.ReleaseComObject/FinalReleaseComObjectを呼び出します。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[8]: フォルダーの選択ダイアログ /sony →Re[10]: フォルダーの選択ダイアログ /sony
 
上記関連ツリー

フォルダーの選択ダイアログ / sony (20/11/22(Sun) 18:39) #96429
Re[1]: フォルダーの選択ダイアログ / Hongliang (20/11/22(Sun) 18:50) #96430
  └ Re[2]: フォルダーの選択ダイアログ / sony (20/11/22(Sun) 19:14) #96431
    └ Re[3]: フォルダーの選択ダイアログ / Hongliang (20/11/22(Sun) 19:53) #96432
      └ Re[4]: フォルダーの選択ダイアログ / sony (20/11/22(Sun) 20:00) #96433
        └ Re[5]: フォルダーの選択ダイアログ / Hongliang (20/11/22(Sun) 20:24) #96434
          └ Re[6]: フォルダーの選択ダイアログ / sony (20/11/22(Sun) 20:43) #96435
            └ Re[7]: フォルダーの選択ダイアログ / Hongliang (20/11/22(Sun) 21:20) #96436
              └ Re[8]: フォルダーの選択ダイアログ / sony (20/11/22(Sun) 21:39) #96437
                └ フォルダーの選択ダイアログ / Hongliang (20/11/22(Sun) 22:06) #96438 ←Now
                  └ Re[10]: フォルダーの選択ダイアログ / sony (20/11/22(Sun) 23:04) #96439 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信