2004/7/8 (木) 11:34:50 fotomo  
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
[3658] GlobalAllocの質問
ソースについての質問なのですが、

クリップボードの関数やドラッグアンドドロップ編集
するところなどでGlobalAllocでメモリ確保してますが、
これらのメモリはどのタイミングでフリーされるのでしょうか?


CEditView::Drop()の中で使われているGetGlobalMemory
なんかでは素人目にはメモリを開放していないようにも見える
のですが。

2004/7/9 (金) 21:52:31 もか  
INCM1.23a
[3662] Re: GlobalAllocの質問
>クリップボードの関数やドラッグアンドドロップ編集
>するところなどでGlobalAllocでメモリ確保してますが、
>これらのメモリはどのタイミングでフリーされるのでしょうか?

クリップボードの場合=SetClipboardDataで設定したハンドルとメモリーは、OS管理下になります。
任意のプロセスがEmptyClipboard()を呼び出した時点でOSが開放します。

ちなみに、SetClipboardDataしたあと、そのハンドルを開放してみると、SetClipboardDataしたプロセスでは、GetClipboardDataを使ってもデータの取得に失敗します。(Win2Kの場合)。

一方D&Dはよく知らないので調べてみた限りでは、
CDataObject::GetData()で、GlobalAllocしてその直後に
>        lpsm->pUnkForRelease = NULL;
と設定してあり、IDataObject::GetData()を呼び出す側がこのメモリーを開放するという指定なので、大丈夫そうです。

問題のデータをもらう側は、futomoさんが指摘しているとおり、
CEditView.cpp の GetGlobalData() の戻り値をGlobalFreeする必要があるようです。

#どうもOLE・COM周りは苦手や

2004/7/12 (月) 21:50:12 もか  
INCM1.23a
[3674] Re:GlobalAllocの質問(訂正)
>問題のデータをもらう側は、futomoさんが指摘しているとおり、
正しくは、fotomoさんです。大変失礼しました。

2004/7/13 (火) 09:55:39 fotomo  
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
[3676] Re2:GlobalAllocの質問(訂正)
回答ありがとうございました。

クリップボード系のメモリ開放タイミングに
ついては非常に良く分かりました。

CEditView::Drop 内で、GetGlobalData関数で
取得したメモリへのハンドルをGlobalFreeして
やれば良いのですね。こちらも理解可能です。

PS:
仕様なのだと思いますが、こんな現象を見つけました。

@NULLを含んだテキストをドラッグ &
ドロップ編集すると、NULLのところでテキストが
打ち切られてしまうようです。

ANULLを含んだテキストを矩形貼り付けできない
ようです。


では。

2004/7/14 (水) 00:40:49 もか  
INCM1.23a
[3678] Re3:GlobalAllocの質問
>PS:
>仕様なのだと思いますが、こんな現象を見つけました。

をを! 報告ありがたいです。

>(1)NULLを含んだテキストをドラッグ & ドロップ編集すると、NULLのところでテキストが打ち切られてしまうようです。
いまのところ、仕様のようです。
D&Dの送り側/受け取り側の両方で、サクラエディタ専用フォーマット(SakuraClip)も扱えるようにしないと直せないと思います。

>(2)NULLを含んだテキストを矩形貼り付けできないようです。
バグだったみたいです。

#改行位置、一部文字を変えました。ご了承を

INCM/CMT
Cyclamen v3.81
[ut:0.010][st:0.010]