COMを初期化せずにこれらの関数を呼び出すことができるという公式の文書は見つかりませんでしたが、いくつかのかわいい観測のためにメモリレーンを移動することができます。
Windows 95は4 MBのRAMを搭載したマシン上で動作していたため、Explorerはole32.dllをロードしないように非常に困難です。実際、シェルチームが独自のミニバージョンのCOMを作成し、シェル拡張機能を記述している人は、可能な場合は実際のCOM/OLEの読み込みを避けるために、Co *関数ではなくSH *関数を呼び出すことになっていました。
This blog postは、Windows XP以降ではmini-COMは100%消えていますが、理論的にはmini-COMモードになるまでにどれくらいの時間がかかりますかわかりません。
Windows 2000にIShellFolder2というシェルインターフェイスがあり、そのメソッドの1つ(GetDetailsEx)がVARIANTを返すということに気付くと、面白いことになります。そして、VARIANTにはBSTRを含めることができます! IColumnProvider :: GetItemDataは、VARIANTも返します。
この情報を使用すると、Windows 2000がCoInitializeを呼び出すことなくBSTRを割り当てることができると推測できます.SHhellFolderを取得するためにSHGetDesktopFolderを呼び出し、文字列として返されるプロパティを要求します。
ここつの未知数があります
- がそれですが、ミニ-COMを使用するWindows 2000用の可能性?
- shell32.dllのIShellFolder2実装は文字列を返す必要がある場合、実際のCOMを初期化しますか?
私はエクスプローラウィンドウが詳細モードのときIShellFolder2とIColumnProviderが関与していることを知っている(または、それがツールチップを必要とする場合は?)ので、シェルはこのために本当のCOMをロードすることをいとわないとは考えにくいです。私はあなたの主な目標は、あなたがBSTR割り当てがIMallocを使用していることがわかりました
のWindows 2000ではないと仮定ので
私はこのすべてを確認できたとしても、それは本当にあなたを助けないでしょう?。 MSDNでは、「オートメーションによってBSTRに割り当てられた領域がキャッシュされる可能性がありますが、これによりSysAllocString/SysFreeStringシーケンスが高速化されますが、IMallocSpyが間違ったメモリユーザーにリークを割り当てる可能性があります。オートメーション。"私はこのキャッシュプロセスがCOMの初期化を必要としないのだろうかと思います。 – yms
いずれにしても、ドキュメントに記載されていることに従わずに*得ることができない利点はありません。 – yms
この質問を調べているうちに、ネットのどこかでIMallocについて読んでいます。そのメリットは、私のソフトウェアがBSTRのスレッドを多用していることです。それらのすべてがCo(Un)Initializeを呼び出す必要があるか、必要でないことを確認する必要があります。 – djsoft