■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
メモリのハンドル
1 名前: 杉山 遥 投稿日: 2000/11/13(月) 12:23
メモリにもハンドルと言うものがあるのでしょうか?
LocalFree、LocalLock などと言う関数でそれらしき
記述を見かけました。このハンドルは変数のポインタから
取得したり出来るのでしょうか?

この辺りの概念がよくわからないのでよろしければ
教えてください。



2 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 12:55
間違ってたらゴメン
普通ハンドルってポインタのことじゃないの?


3 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 13:12
え? ハンドル = ポインタのポインタでしょ?
Mac では、typedef char *Ptr; typedef Ptr *Handle; だった。


4 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 13:13
違うよ。ま、ポインタをハンドル代わりとして扱う
のは構わないけど、ハンドルをポインタ代わりに扱
うのは特殊な場合を除いてダメ。

特殊な場合ってのは、GLobalAlloc()やLocalAlloc()
なら、タイプがGPTRの時とか。

ハンドルってのは、単に識別子でしかないのよ。


5 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 13:13
間違ってたらゴメン
普通ハンドルって自動車に付いているのアレのことじゃないの?


6 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 13:31
違うよ。ま、アレをハンドル代わりとして扱う
のは構わないけど、ハンドルをアレ代わりに扱
うのは特殊な場合を除いてダメ。

ハンドルってのは、単に識別子でしかないのよ。



7 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 14:03
バンドルって結局抱き合わせだよね


8 名前: 名無しさん@DTMF 投稿日: 2000/11/13(月) 15:21
間違ってたらゴメン
普通パンドラって空けてはいけないアレのことじゃないの?

間違ってたらゴメン
普通コンドルってペルーなんかにいるアレのことじゃないの?

間違ってたらゴメン
普通バンドルってハードを買うとついてくるアレのことじゃないの?


9 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 15:32
間違ってたらゴメン
普通パンヤオってチューヤンの名字のことじゃないの?

間違ってたらゴメン
普通ハンドルってここでよく見るdjのことじゃないの?


10 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 15:45
違うよ。ま、チューヤンをパンヤオ代わりとして扱う
のは構わないけど、パンヤオをアレ代わりに扱
うのは特殊な場合を除いてダメ。

特殊な場合ってのは、アフリカ縦断()やoperator += 伊藤
とかなら、タイプが電波少年の時とか。

パンヤオってのは、単に識別子でしかないのよ。


11 名前: jd 投稿日: 2000/11/13(月) 15:46
ちなみにおれはドルトン。専門は化学だ。


12 名前: 1です 投稿日: 2000/11/13(月) 16:14
Win32でエディットコントロールが参照しているメモリを
変更したいのです。

ためしたのは
EM_GETHANDLEでコントロールのハンドルを取得して
LocalFreeで解放。
これはハンドルは帰ってきましたが解放できませんでした。
これがうまく行けば新規の変数のハンドルを取得して
EM_SETHANDLEでコントロールに設定しようと思っています。
根本的に間違っているかもしれませんが
何かアドバイスがあったらお願いします。



13 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 18:12
>>12

今時Windows3.1ですか?そうでないなら、結局同じ
とは言えGlobalXX系を使いましょう。LocalXX系は16
bit時代の互換のためのものです。

順序としては、EM_GETHANDLEでエディットコントロー
ルのハンドルを取得、GlobalAlloc()で自分用メモリハ
ンドル取得、EM_SETHANDLEで自分用設定、GlobalFree()
でEM_GETHANDLEで取得したハンドルの開放でしょうか。

このハンドルの指すメモリ内容を変更する場合は
GLobalLock()でポインタを得てからです。
使用後はGlobalUnlock()して下さい。


14 名前: 投稿日: 2000/11/13(月) 18:14
>13さん
レス有難うございます。早速試してみます。



15 名前: 杉山 遥 投稿日: 2000/11/13(月) 19:27
以下の手順で行いましたがエディットコントロールに入力できませんでした。
なにか誤った点がありますでしょうか?

(1) EM_GETHANDLE で現在のメモリハンドル取得
(2) GlobalAlloc で GPTRフラグで新規メモリ作成 (ハンドルが返りました)
(3) EM_SETHANDLE で (2) のハンドルを指定
(4) GlobalFree で (1) のハンドルを解放 (Nullが返ってきたので成功しました)
(5) GlobalLock で (2) ハンドルを指定しポインタを取得 (成功しました)
(6) エディットに入力してみるが入力不可能。

もう一点なのですが(1) で取得したハンドルのポインタを取得する方法は
ありますか? このハンドルに GlobalLock は働きませんでした。

APIは駆け出しなのでなにぶん勘違いもあるかと思いますが
よろしくお願いします。




16 名前: Visual名無しさん 投稿日: 2000/11/13(月) 20:49
> (5) GlobalLock で (2) ハンドルを指定しポインタを取得 (成功しました)
 Lockしちゃったらエディットコントロール側で書き込めなくなるのでは?

…外してるかも。


17 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 21:13
>>13
Win32ではGlobal〜()系とLocal〜()系に差はないと思うけど。
両方ともWin16互換APIなんだし。
Win32 nativeなのはHeap〜()系とVirtual〜()系ね。


18 名前: 3 投稿日: 2000/11/13(月) 22:40
>ハンドルってのは、単に識別子でしかないのよ。
勉強になりやした。どうも。UNIXでは聞きなれない言葉だなあ。


19 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/11/13(月) 22:57
処理系の話で、CGの話の時なんかにハンドルって出てくるね。
unixであまり聞かないのは86の16bit環境でメモリのスワップを
する話でよく出るから、目立たないのかも。