사업왕이 커가는곳


API 함수중에 CopyMemory 라고 있다.
메모리의 특정 위치의 값을 원하는 변수로 접근 가능하도록 해 주는 함수인데...
지금 할려는건 메모리에 기록된 값을 문자열(string)로 변환해 주는 설명이다.

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef pDest As IntPtr, ByRef pSrc As IntPtr, ByVal ByteLen As Integer)
'// 이런식으로 선언하고

'// lParam포인트 부터 Len(recvMsg) - 1만큼을 복사해서 그 시작 주소를ptr여기 알려주라...
CopyMemory(ptr, lParam, Len(recvMsg) - 1) '//이런식으로 사용한다.

'// vb6.0에는 변수의 주소를 알수 있기 때문에 사용이 가능하나 .net계열에서는 변수의 포인트를 알아 올수가 없기 때무에 사용이 불가능하다.
'// 한마디로 쓸수 없는 함수가 된거다.

'// 그래서 찾은 방법이다. 데브피아에서 찾았다.
'// 출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=44&MAEULNo=18&no=27315&ref=27315
'// Marshal을 이용하는건데... 정확한 깊이 있는 설명이 될것 같지는 않지만 용도는 비슷하다.
'// 설명은...
Public NotInheritable Class Marshal
          Inherits System.Object
     System.Runtime.InteropServices
요약:
관리되지 않는 메모리를 할당하고, 관리되지 않는 메모리 블록을 복사하고, 관리되는 형식을 관리되지 않는 형식으로 변환하는 메서드의 컬렉션 및 비관리 코드와 상호 작용할 때 사용되는 기타 메서드의 컬렉션을 제공합니다.

 
recvMsg = New String(" ", 4096)    '// 최종 자료가 저장될 문자와 길이를 결정하고
Dim strChar(4096) As Byte             '// 임시로 사용할 변수를 선언한다.
Marshal.Copy(lParam, strChar, 0, Len(recvMsg) - 1) '// 실제로 CopyMemory와 같은 역활을 해 주는데 대신 포인트를 주는건 아니고 바로 값을 변수에 복사해준다.

Dim ecd As New System.Text.ASCIIEncoding '// 문자로 변환하기 위해서 엔코더를 선언하고
recvMsg  = ecd.GetString(strChar)                 '// 바이트(byte)배열을 문자열(string)으로 변경하면된다.

CopyMemory 의 용도가 여러가지이기 때문에 상황에 맞게 변경해야 할듯하다.