tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル マップドファイルからメモリコピー
投稿日: 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);

勉強不足でお手間を取らせますが、お知恵をおかしください。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。