タイトル | : マップドファイルからメモリコピー |
記事No | : 10967 |
投稿日 | : 2012/11/28(Wed) 00:23 |
投稿者 | : empty |
いつもお世話になります。
c++にてマップドファイルを作成し、VB.netでメモリコピーし、データを確認(参照)する といったことを行いたいのですが、VB.netにてメモリコピーがうまく行えません。
■環境 c++、VB.net(Visual Sutdio 2005)
■ソース --------<c++>---------- //※eInfoは別関数にて値を代入しています //仮として下記が格納されているとする // eInfo.a = 11; // eInfo.b = _T(test);
typedef struct _SHARED_DATA { int a; char* b; }SHARED_DATA;
bool test(SHARED_DATA* eInfo) {
HANDLE m_hMapFile; // メモリマップファイルハンドラ SHARED_DATA* GLB_lpMapAddr; // 共有メモリアドレス
m_hMapFile = CreateFileMapping( (HANDLE)0xffffffff, NULL , PAGE_READWRITE | SEC_COMMIT , 0 , 1024 , "ABC" ); GLB_lpMapAddr = (SHARED_DATA *)MapViewOfFile( m_hMapFile , FILE_MAP_WRITE , 0 , 0 , 0 ); memcpy(GLB_lpMapAddr,eInfo,sizeof(SHARED_DATA)); }
------------------------
--------<VB.net>---------- ' ボタンを押すとマップドファイルの値を参照する '
Private Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click Dim hFileMap As IntPtr Dim fMap As IntPtr Dim eInfo As SHARED_DATA
hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, True, MAPPED_FILE_NAME) If hFileMap = 0 Then MsgBox("失敗") Return End If
fMap = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0) 'Call MoveMemory(eInfo, fMap, Len(eInfo)) 'ここがうまくいかない 'eInfo = Marshal.PtrToStructure(fMap, GetType(SHARED_DATA))'ここがうまくいかない
UnmapViewOfFile(fMap) CloseHandle(hFileMap)
}
#Region "OpenFileMapping定義" Declare Function OpenFileMapping Lib "kernel32" Alias "OpenFileMappingA" _ (ByVal flProtect As UInt32, _ ByVal flg As Boolean, _ ByVal lpName As String) As Integer #End Region
#Region "MapViewOfFile定義" Declare Function MapViewOfFile Lib "kernel32" ( _ ByVal hFileMappingObject As IntPtr, _ ByVal dwDesiredAccess As UInt32, _ ByVal dwFileOffsetHigh As UInt32, _ ByVal dwFileOffsetLow As UInt32, _ ByVal dwNumberOfBytesToMap As UInt32) _ As UInt32 #End Region
#Region "MoveMemory定義(Intptr→integer)"
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ ByVal Dest As String, _ ByVal Source As IntPtr, _ ByVal length As Integer)
#End Region --------------------------
どうにかして、メモリ共有を使用し、 VB側で下記のデータを確認したいのですが、 どうしたらよいのでしょうか? また、何が悪いのでしょうか? // eInfo.a = 11; // eInfo.b = _T(test);
勉強不足でお手間を取らせますが、お知恵をおかしください。
|