Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5866 / 13645 ツリー ←次へ | 前へ→

【48451】メモリイメージの変数直接格納って出来ますでしょうか? ぎゃろぽん 07/4/18(水) 10:22 質問[未読]
【48454】Re:メモリイメージの変数直接格納って出来... Blue 07/4/18(水) 11:12 回答[未読]
【48455】Re:メモリイメージの変数直接格納って出来... ぎゃろぽん 07/4/18(水) 11:15 お礼[未読]
【48468】Re:メモリイメージの変数直接格納って出来... ぎゃろぽん 07/4/18(水) 17:30 質問[未読]
【48471】Re:メモリイメージの変数直接格納って出来... Blue 07/4/18(水) 17:55 回答[未読]
【48484】Re:メモリイメージの変数直接格納って出来... ichinose 07/4/19(木) 6:30 発言[未読]
【48490】Re:メモリイメージの変数直接格納って出来... ぎゃろぽん 07/4/19(木) 9:45 お礼[未読]
【48480】Re:メモリイメージの変数直接格納って出来... ichinose 07/4/18(水) 21:56 発言[未読]

【48451】メモリイメージの変数直接格納って出来ま...
質問  ぎゃろぽん  - 07/4/18(水) 10:22 -

引用なし
パスワード
   任意の変数singleに、メモリイメージを直接格納することは可能でしょうか?

例えば、Singleに100を格納した場合、そのメモリイメージはHEXで"42C80000"になりますが、逆に、Single変数に"42C80000"を直接格納することで、Single変数の中身を100にしたいのです。

ご存知の方がいましたら、ご教授お願いします。

【48454】Re:メモリイメージの変数直接格納って出...
回答  Blue  - 07/4/18(水) 11:12 -

引用なし
パスワード
   APIを使うのが簡単でしょう。

Private Declare Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
  (ByRef Dest As Any, ByRef Source As Any, ByVal length As Long)

Sub test()
  Dim s As Single
  
  MoveMemory s, &H42C80000, LenB(s)
  MsgBox s
End Sub

【48455】Re:メモリイメージの変数直接格納って出...
お礼  ぎゃろぽん  - 07/4/18(水) 11:15 -

引用なし
パスワード
   ▼Blue さん:
 

色々やってみてだめだったことが解決されました。
助かりました。ありがとうございます。

>APIを使うのが簡単でしょう。
>
>Private Declare Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
>  (ByRef Dest As Any, ByRef Source As Any, ByVal length As Long)
>
>Sub test()
>  Dim s As Single
>  
>  MoveMemory s, &H42C80000, LenB(s)
>  MsgBox s
>End Sub

【48468】Re:メモリイメージの変数直接格納って出...
質問  ぎゃろぽん  - 07/4/18(水) 17:30 -

引用なし
パスワード
   重ねての質問で申し訳ありません。
MoveMemoryはシークなどの機能はあるのでしょうか?

doubleなど8バイトの変数に格納するのに、8バイトを
前の4バイトと後ろの4バイトで分けて格納すれば出来る
と思い、やってみましたが、どうにも上手く行きません。

お手数ですが、ご教授願います。


>▼Blue さん:
> 
>
>色々やってみてだめだったことが解決されました。
>助かりました。ありがとうございます。
>
>>APIを使うのが簡単でしょう。
>>
>>Private Declare Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
>>  (ByRef Dest As Any, ByRef Source As Any, ByVal length As Long)
>>
>>Sub test()
>>  Dim s As Single
>>  
>>  MoveMemory s, &H42C80000, LenB(s)
>>  MsgBox s
>>End Sub

【48471】Re:メモリイメージの変数直接格納って出...
回答  Blue  - 07/4/18(水) 17:55 -

引用なし
パスワード
   配列かユーザ定義型を使えばいいです。

  Dim d As Double
  Dim mem(1) As Long
  
  mem(0) = &H42C80000
  mem(1) = &H42C80000
  
  MoveMemory d, mem(0), LenB(d)
  MsgBox d

みたいに。

【48480】Re:メモリイメージの変数直接格納って出...
発言  ichinose  - 07/4/18(水) 21:56 -

引用なし
パスワード
   こんばんは。


>APIを使うのが簡単でしょう。
>
>Private Declare Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
>  (ByRef Dest As Any, ByRef Source As Any, ByVal length As Long)
>
>Sub test()
>  Dim s As Single
>  
>  MoveMemory s, &H42C80000, LenB(s)
>  MsgBox s
>End Sub

APIで可能なんですね!!メモメモ

では、私流です。

標準モジュールに


'====================================================================
Sub sample()
  Dim dd As Double
  Dim ss As Single
  '================100===============================
  Call prc_movememory(dd, LenB(dd), &H40590000, &H0)
  Call prc_movememory(ss, LenB(ss), &H42C80000)
  MsgBox "dd= " & dd & vbCrLf & _
      "ss= " & ss
  '================255===============================
  Call prc_movememory(dd, LenB(dd), &H406FE000, &H0)
  Call prc_movememory(ss, LenB(ss), &H437F0000)
  MsgBox "dd= " & dd & vbCrLf & _
      "ss= " & ss
  '================0.112===============================
  Call prc_movememory(dd, LenB(dd), &H3FBCAC08, &H3126E979)
  Call prc_movememory(ss, LenB(ss), &H3DE56042)
  MsgBox "dd= " & dd & vbCrLf & _
      "ss= " & ss
End Sub
'=========================================================================
Sub prc_movememory(myvalue As Variant, mylen As Long, ParamArray src() As Variant)
  Dim g0 As Long
  Dim fnum As Long
  Dim dd As Double
  Dim ss As Single
  On Error Resume Next
  Const flnm = "\binary.tmp"
  Kill ThisWorkbook.Path & flnm
  On Error GoTo 0
  fnum = FreeFile()
  Open ThisWorkbook.Path & flnm For Random As #fnum Len = 4
  For g0 = UBound(src()) To LBound(src()) Step -1
    Put #fnum, , CLng(src(g0))
    Next
  Close #fnum
  Open ThisWorkbook.Path & flnm For Random As #fnum Len = mylen
  If mylen = 4 Then
    Get #fnum, 1, ss
  Else
    Get #fnum, 1, dd
    End If
  Close #fnum
  Kill ThisWorkbook.Path & flnm
  myvalue = IIf(mylen = 4, ss, dd)
End Sub

一度保存してからsampleを実行してください。
尚、テンポラリファイルとして上記コードのあるブックと同じフォルダに
「binary.tmp」というファイルが一時的に作成されます。

試してみてください。

【48484】Re:メモリイメージの変数直接格納って出...
発言  ichinose  - 07/4/19(木) 6:30 -

引用なし
パスワード
   おはようございます。
>配列かユーザ定義型を使えばいいです。
>
>  Dim d As Double
>  Dim mem(1) As Long
>  
  mem(0) = &H0
  mem(1) = &H405900000
'因みに配列に入れるなら、逆に入れるのですね!!
>  
>  MoveMemory d, mem(0), LenB(d)
>  MsgBox d
>
>みたいに。

【48490】Re:メモリイメージの変数直接格納って出...
お礼  ぎゃろぽん  - 07/4/19(木) 9:45 -

引用なし
パスワード
   ▼Blue さん:
▼ichinose さん:

何度もありがとうございます。
助かりました。

5866 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free