[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/11/05(Sat) 15:17
投稿者名:筆武将
URL :
タイトル:
指定ハンドルに自作オブジェクトプロパティを(メモリ上で仮想的に)新規作成するには
VB6で以下のようにクラスモジュールをプロパティとして渡したいと思っています。

ハンドルがMe.hwndだけなら、Public Property を使えば良いのですが、
実際は他のハンドルにも使うつもりです。

以下のようにすれば値が得られると思いきや、全てゼロでした。

このような方法では無理なのでしょうか?
よろしくお願いします。


'フォームモジュール
Option Explicit

Private Sub Command1_Click()
  Call GetMemoryProperty(Me.hWnd)
End Sub

Private Sub Form_Load()
  Dim cTest As clsTest
  Set cTest = New clsTest
  With cTest
    .ItemA = 123
    .ItemB = 234
    .ItemC = 345
    .ItemD = 456
  End With
  If SetMemoryProperty(Me.hWnd, cTest) Then
    Command1.Enabled = True
  Else
    Command1.Enabled = False
  End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Call DestroyMemoryProperty(Me.hWnd)
End Sub

'標準モジュール
Option Explicit

Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hWnd As Long, ByVal
lpString As Any) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hWnd As Long, ByVal
lpString As String, ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hWnd As Long,
ByVal lpString As String) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As
Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (ByRef Destination As
Any, ByVal Length As Long)

Private Const OBJECT_PROPERT As String = "MyObjectProperty"

Public Function SetMemoryProperty(hWnd As Long, cTest As clsTest) As Boolean
  If SetProp(hWnd, OBJECT_PROPERT, ObjPtr(cTest)) Then
    SetMemoryProperty = True
  End If
End Function

Public Function GetMemoryProperty(hWnd As Long) As Boolean
  Dim cTest      As clsTest
  Dim lngPointer As Long
  
  Set cTest = New clsTest 'ここをコメントにするとVBが落ちる
  
  lngPointer = GetProp(hWnd, OBJECT_PROPERT)
  CopyMemory cTest, lngPointer, 4

  Debug.Print cTest.ItemA, cTest.ItemB, cTest.ItemC, cTest.ItemD '全てゼロ
  
  ZeroMemory cTest, 4&
  'CopyMemory cTest, 0&, 4
End Function

Public Function DestroyMemoryProperty(hWnd As Long) As Boolean
  Call RemoveProp(hWnd, OBJECT_PROPERT)
End Function


'クラスモジュール(clsTest)
Option Explicit

Public ItemA As Long
Public ItemB As Long
Public ItemC As Long
Public ItemD As Long

投稿時間:2005/11/07(Mon) 11:49
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: 指定ハンドルに自作オブジェクトプロパティを(メモリ上で仮想的に)新規作成するには
まず、単純に理解・勉強が不足しています。

> VB6で以下のようにクラスモジュールをプロパティとして渡したいと思っています。

独自に生成したクラスをプロパティとして使いたい、ということ
ですよね。
# 「モジュール」を付けると意味が変わります。

簡単に直すなら、以下の部分を追加するとか。

> Public Function SetMemoryProperty(hWnd As Long, cTest As clsTest) As Boolean

   Dim oBuffer As clsTest

>   If SetProp(hWnd, OBJECT_PROPERT, ObjPtr(cTest)) Then
>     SetMemoryProperty = True

    Set oBuffer = cTest
    Call ZeroMemory(oBuffer, 4&)

>   End If
> End Function

> Public Function DestroyMemoryProperty(hWnd As Long) As Boolean

    Dim pBuffer As Long
    Dim oBuffer As clsTest

    pBuffer = = GetProp(hWnd, OBJECT_PROPERT)
    Call CopyMemory(oBuffer, pBuffer, 4&)
    Set oBuffer = Nothing

>   Call RemoveProp(hWnd, OBJECT_PROPERT)
> End Function

投稿時間:2005/11/07(Mon) 23:45
投稿者名:筆武将
URL :
タイトル:
Re^2: (お礼)指定ハンドルに自作オブジェクトプロパティを(メモリ上で仮想的に)新規作成するには
お返事、ありがとうございます。

> まず、単純に理解・勉強が不足しています。
> 独自に生成したクラスをプロパティとして使いたい、ということ
> ですよね。
> # 「モジュール」を付けると意味が変わります。

わかりづらくて申し訳ありませんでした。
クラスですね。勉強します。

> 簡単に直すなら、以下の部分を追加するとか。

なぜ駄目だったのかわからないので勉強します。
ありがとうございました。

このあたりかな。
(ポインタ/バッファ/ObjPtr/RtlMoveMemory/RtlZeroMemory)

投稿時間:2005/11/08(Tue) 10:56
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: (お礼)指定ハンドルに自作オブジェクトプロパティを(メモリ上で仮想的に)新規作成するには
> > 簡単に直すなら、以下の部分を追加するとか。
> なぜ駄目だったのかわからないので勉強します。

とりあえず、あれで上手く行ったのでしょうか?

> このあたりかな。
> (ポインタ/バッファ/ObjPtr/RtlMoveMemory/RtlZeroMemory)

いや、COMのオブジェクトの管理の基礎に関してです。