Memory mapped file domanda

di il
14 risposte

Memory mapped file domanda

Ciao a tutti , scusate la domanda , ho creato un memory map file senza file fisico , lo creo con un codice C# e lo vado a leggere con un altro linguaggio , un po "antico "similare al c++ , funziona tutto , il problema e' che mi ritorna anziche la stringa che voglio , mi ritorna tutta una serie di caratteri ????????? , ne deduco che sia un problema di codifica , ora so che il linguaggio "antico", non digerisce tanto bene l unicode perquesto dentro il codice C# ho fatto l encode in ASCII , ma mi ritorna ugualmente la stessa zuppa , al che ho fatto una prova in C++ anziche in C# , e con C++ lavora bene , ma ovviamente lo devo fare in C# , quindi ero a chiedere se a qualcuno piu esperto fosse capitata una cosa del genere e se si come abbia risolto allego anche i codici C# e C++
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.MemoryMappedFiles;
using System.ComponentModel;
using System.Windows.Input;
using System.IO;

namespace MemoryMappedCS_1
{
    class Program
    {
        static void Main(string[] args)
        {
            var file = MemoryMappedFile.CreateOrOpen("Test", 1000,MemoryMappedFileAccess.ReadWrite);
            try
            {    
                byte[] de = Encoding.ASCII.GetBytes("Demade");
                MemoryMappedViewAccessor accessor = file.CreateViewAccessor();
                accessor.Write(0, (char)de.Length);
                accessor.WriteArray(0,de,0,de.Length);
             }
            catch
            {
            }
                Console.WriteLine("Run memory mapped file reader before exit");
                Console.WriteLine("Press any key to exit ...");
                Console.ReadLine();
        }
    }
}


C++
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#define BUF_SIZE 1000
TCHAR szName[] = TEXT("Test");
TCHAR szMsg[] = TEXT("Message from first process.");

int _tmain()
{
    HANDLE hMapFile;
    LPCTSTR pBuf;

    hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // use paging file
        NULL,                    // default security
        PAGE_READWRITE,          // read/write access
        0,                       // maximum object size (high-order DWORD)
        BUF_SIZE,                // maximum object size (low-order DWORD)
        szName);                 // name of mapping object

    if (hMapFile == NULL)
    {
        _tprintf(TEXT("Could not create file mapping object (%d).\n"),
            GetLastError());
        return 1;
    }
    pBuf = (LPTSTR)MapViewOfFile(hMapFile,   // handle to map object
        FILE_MAP_ALL_ACCESS, // read/write permission
        0,
        0,
        BUF_SIZE);

    if (pBuf == NULL)
    {
        _tprintf(TEXT("Could not map view of file (%d).\n"),
            GetLastError());

        CloseHandle(hMapFile);

        return 1;
    }


    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
    _getch();

    UnmapViewOfFile(pBuf);

    CloseHandle(hMapFile);

    return 0;
}
grazie in anticipo a chiunque avra il tempo di darmi una mano
saluti

14 Risposte

  • Re: Memory mapped file domanda

    Ma l'altro linguaggio qual è? E cosa hai scritto?
  • Re: Memory mapped file domanda

    Ma l altro linguaggio non e' importante perche e' sicuro che va , anche perche se uso il C++ invece che il C# funziona quindi il problema sta a monte nel C#
    probabilmente c'e' qualcosa che non codifica o bo
  • Re: Memory mapped file domanda

    Ok ma sarebbe utile avere il codice con il terzo linguaggio e provare perché con C++ funziona e con C# no
  • Re: Memory mapped file domanda

    Lo fa anche con C++, nel senso se lanci il C# come primario e C++ come secondo per ricevere mi da dei caratteri strani
    ti metto il C++ tanto il problema e' a monte
    
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <tchar.h>
    #pragma comment(lib, "user32.lib")
    
    #define BUF_SIZE 1000
    TCHAR szName[] = TEXT("Test");
    //TCHAR szName[] = TEXT("test");
    
    int _tmain()
    {
        HANDLE hMapFile;
        LPCTSTR pBuf;
    
        hMapFile = OpenFileMapping(
            FILE_MAP_ALL_ACCESS,   // read/write access
            FALSE,                 // do not inherit the name
            szName);               // name of mapping object
    
        if (hMapFile == NULL)
        {
            _tprintf(TEXT("Could not open file mapping object (%d).\n"),
                GetLastError());
            return 1;
        }
    
        pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
            FILE_MAP_ALL_ACCESS,  // read/write permission
            0,
            0,
            BUF_SIZE);
    
        if (pBuf == NULL)
        {
            _tprintf(TEXT("Could not map view of file (%d).\n"),
                GetLastError());
    
            CloseHandle(hMapFile);
    
            return 1;
        }
    
        MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
    
        UnmapViewOfFile(pBuf);
    
        CloseHandle(hMapFile);
    
        return 0;
    }
    
  • Re: Memory mapped file domanda

    Nel progetto C++, nelle proprietà del Progetto, in Generale, devi impostare "set di caratteri multibyte" al posto di "caratteri unicode"
  • Re: Memory mapped file domanda

    Non ce' in generale ho VS 2019 comuniti edition
  • Re: Memory mapped file domanda

    Come no? In "Set di caratteri"?
  • Re: Memory mapped file domanda

    Scusa ma io non lo vedo propio
    https://ibb.co/cQrGgn
  • Re: Memory mapped file domanda

    Vedi se nel 2019 è stata spostata su Advanced ... cerca la voce "Set di caratteri"
  • Re: Memory mapped file domanda

    Ok su c++ il problema e' risolto , ma c'e' la possibilita anziche modificare il c++ modificare il c# per far si che il c++ vada?
    ti chiedo questo perche il programma che uso e' un programma che non ha la possibilita di modificare tante cose
    questa e la tabella del codepace possibili
    Using a Codepage in String Conversion Operations

    Built-in Constants of Codepages
    Constant
    Value
    Description
    CP_ACP
    0
    The current Windows ANSI code page.
    CP_OEMCP

    1


    The current system OEM code page.

    CP_MACCP


    2


    The current system Macintosh code page.

    Note: This value is mostly used in earlier created program codes and is of no use now, since modern Macintosh computers use Unicode for encoding.

    CP_THREAD_ACP


    3


    The Windows ANSI code page for the current thread.

    CP_SYMBOL


    42


    Symbol code page

    CP_UTF7


    65000


    UTF-7 code page.

    CP_UTF8


    65001


    UTF-8 code page.
  • Re: Memory mapped file domanda

    Il codepage non c'entra. Continui ad essere misterioso sul terzo programma ma se non ci dici nulla di questo non si può capire molto.

    Puoi usare Unicode al posto ASCII per l'encoding in C# ma così si va al buio.
  • Re: Memory mapped file domanda

    In effetti se scrivi

    byte[] de = Encoding.Unicode.GetBytes("Demade");

    funziona.
  • Re: Memory mapped file domanda

    Non per fare il misterioso e solo non credo servira poi a molto il codice ma te lo posto
    
    #define FILE_MAP_READ           4
    
    #define BUF_SIZE 1000
    extern string szName = "Test";
    int handle = 0;
    string  Data;
    
    #import "kernel32.dll"
    string  MapViewOfFile(int hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytestoMap);
    int CloseHandle(int handle);
    int UnmapViewOfFile(string lpBaseAddress);
    int OpenFileMappingW(uint dwDesiredAccess, bool bInheritHandle, string lpName);
    #import
    
    
    int main()
      {
       handle = OpenFileMappingW(FILE_MAP_READ, False, szName);
       if(handle == 0)
         {
          Print("Could not open file mapping object", GetLastError());
         }
       else
         {
          Data = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, BUF_SIZE);
          Print ("DA C++VA DA C# NOOO-"+Data);
          UnmapViewOfFile(Data);
          CloseHandle(handle);
         }
    
    
      }
    
  • Re: Memory mapped file domanda

    Era semplicemente Encoding.Unicode.GetBytes("Demade"); daiiii eppure mi pareva di averlo testato ba sono propio lesso avvolte ti ringrazio infinitamente
    P.S. ricorda che tornero' a tediarti.. grazie ancora
Devi accedere o registrarti per scrivere nel forum
14 risposte