掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
GlobalAllocにCopyMemoryで構造体をコピーするには (ID:101921)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
早速の回答ありがとうございます。 ご指摘のようにCopyMemoryの第1引数の宣言を「ByVal Any」にすると うまくいきました。私の注意不足でした。 「ByRef」とした場合は参照渡しになるということは理解してるつもり です。 「ByVal」とした場合は値渡しになり、CopyMemoryの場合は第1引数が 指し示すアドレスへ指定サイズ分コピーするということになるのでし ょうか? また、第2引数はアドレスではなく構造体を渡していますが、これは どのように考えればよいのでしょうか? 最初の質問のテストプログラムにCopyMemory2を追加をして以下のよう なプログラムにしました。 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) Declare Sub CopyMemory2 Lib "Kernel32.dll" Alias "RtlMoveMemory" (ByRef lpDest As Any, _ ByVal lpSrc As Any, ByVal lSize As Long) Type TestMM lNum1 As Long lNum2 As Long End Type Sub TestCopyMemory() Dim oMM As TestMM, oMM2 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 CopyMemory2(lpDest:=oMM2, lpSrc:=hGLock, lSize:=lBytes) Call GlobalUnlock(hMem:=hGLock) End If Call GlobalFree(hMem:=hGAlloc) End If End Sub このプログラムを実行するとoMM2には期待通り oMM2.lNum1 に 1 oMM2.lNum2 に 2 が入ります。この掲示板などで調べると、CopyMemoryの引数の型によ って宣言を変えないといけないようなのですが、そのような理解でよ いのでしょうか?
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.