タイトル : マップドファイルからメモリコピー 投稿日 : 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); 勉強不足でお手間を取らせますが、お知恵をおかしください。 |