掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
GlobalAllocにCopyMemoryで構造体をコピーするには (ID:101919)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
おかどちがいな質問だと思うのですが、他にアテがないので質問させて下さい。 Excel2000でVBAを勉強しているのですが、ChooseFontダイアログの処理がうまくいきません。 ダイアログ自体は表示されるのですが、LOGFONT構造体の設定をダイアログに反映させたり、 ダイアログの設定を取得したいのですが出来ません。似たような処理として以下のような簡 単なテストプログラムを作りました。 Public Const GHND = &H42 Declare Function GlobalAlloc Lib "Kernel32.dll" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long Declare Function GlobalFree Lib "Kernel32.dll" (ByVal hMem As Long) As Long Declare Function GlobalLock Lib "Kernel32.dll" (ByVal hMem As Long) As Long Declare Function GlobalUnlock Lib "Kernel32.dll" (ByVal hMem As Long) As Long Declare Sub CopyMemory Lib "Kernel32.dll" Alias "RtlMoveMemory" (ByRef lpDest As Any, _ ByRef lpSrc As Any, ByVal lSize As Long) Type TestMM lNum1 As Long lNum2 As Long End Type Sub TestCopyMemory() Dim oMM As TestMM Dim hGAlloc As Long, hGLock As Long Dim lBytes As Long lBytes = Len(oMM) hGAlloc = GlobalAlloc(uFlags:=GHND, dwBytes:=lBytes ) If hGAlloc <> 0 Then hGLock = GlobalLock(hMem:=hGAlloc) If hGLock <> 0 Then oMM.lNum1 = 1 oMM.lNum2 = 2 Call CopyMemory(lpDest:=hGLock, lpSrc:=oMM, lSize:=lBytes) Call GlobalUnlock(hMem:=hGLock) End If Call GlobalFree(hMem:=hGAlloc) End If End Sub このプログラムでCopyMemoryを実行すると、変数hGLockの値が変わってしまうのです。 具体的にはhGLockにはアドレスの値が入ってるハズなのですが、"2"になってしまい、 hGAllocの値が"1"になってしまうのです。 hGLockはLong型であり、変数へコピーしているのだからサイズ的にTestMM構造体の4バ イト分がコピーされてしまうと考えれば納得できます。でも、他のサイトと見てもこ のような方法で確保したメモリにコピーできるようなのです。 私はCopyMemoryの第1と第2引数の型のAnyがよく分かっていません。 CopyMemoryの引数に渡された変数のアドレスで内部処理をしているような考えなのです が、第1引数に渡されるLong型がそのままアドレスとして認識されるのであれば、その アドレスが指し示す領域に指定したサイズのデータがコピーされると思います。 VisualBasicの掲示板にVBAの質問で申し訳ないのですが、出来れば答えてもらえないで しょうか。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.