Проблема с CreateFileMapping
От: BlackShadow  
Дата: 14.11.07 15:32
Оценка:
Доброго всем времени суток.

Возникла у меня проблема с CreateFileMapping...
Должен происходить примерно такой процесс:
1) Запускается приложение на unmanaged C++ (А)
2) А создаёт file mapping именованный
3) А создаёт евент именованный
4) А запускает приложение на C# (managed) (Б)
5) А начинает ждать созданный евент
6) Б открывает file mapping созданный A и записывает туда какие-то данные
7) Б запускает евент созданный в А
8) А считывает данные из file mapping и закрывается

примерно так выглядит А:

    HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, L"TestFile");
    HANDLE hEvent = CreateEvent(NULL, true, false, L"TestEvent");
    WaitForSingleObject(hEvent, INFINITE);
//Запуск Б
    CloseHandle(hEvent);
    SetFilePointer(hFile, 0, NULL, SEEK_SET);
    BYTE* data = new BYTE[4];
    DWORD count;
    ReadFile(hFile, data, 4, &count, NULL);
    for (int i = 0; i < count; i++){
        cout << data[i];
    }
    CloseHandle(hFile);


примерно так выглядит Б:


        [DllImport("kernel32.dll")]
        private static extern IntPtr CreateFileMapping(IntPtr hFile, IntPtr lpFileMappingAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
        [DllImport("kernel32.dll")]
        private static extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);
        [DllImport("Kernel32.dll")]
        static extern int SetFilePointer(IntPtr hFile, int lDistanceToMove, ref int lpDistanceToMoveHigh, EMoveMethod dwMoveMethod);

        private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
        private const int PAGE_READWRITE = 4;


            IntPtr file = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, PAGE_READWRITE, 0, 4096, "TestFile");
            int len;
            byte[] data = new byte[4];
            for(int i = 0; i< data.Length;i++) {
                data[i] = (byte)i;
            }
            WriteFile(file, data, data.Length, out len, IntPtr.Zero);
            Console.WriteLine(len);
            int pos2 = 0;
            len = SetFilePointer(file, 0, ref pos2, EMoveMethod.End);
            Console.WriteLine(len);
            EventWaitHandle handle = EventWaitHandle.OpenExisting("TestEvent");
            handle.Set();


В Б удаётся записать 0 байт, в А соответственно столько же считать...
кто-нибудь сталкивался с чем-нибудь подобным?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.