Межпроцессное взаимодействие с использованием MemoryMappedFiles или именованных каналов в VC ++ и C # в Windows 7 - PullRequest
1 голос
/ 24 марта 2011

Я пытаюсь установить связь между VC ++ DLL и приложением C #. Я прочитал тонны ресурсов и материалов, я пытался сделать это и с файлами MemoryMapped, и с Pipes, но, к сожалению, я не смог приступить к работе.

Вот как я создаю часть "приемника" / сервера, написанную на C #:

// MemoryMappedFile approach
mmf = MemoryMappedFile.CreateNew(
            @"myMMF",
            1024*1024,
            MemoryMappedFileAccess.ReadWriteExecute);

// Named Pipe approach
NamedPipeServerStream pipe = new NamedPipeServerStream("myPipe", PipeDirection.InOut);

Это аналог VC ++:

// MMF approach
HANDLE fmap = ::OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, false, (LPCWSTR)"myMMF");
if(fmap == NULL)
    return errorMsg();

// Named pipe
HANDLE pipe = ::CreateFile((LPCWSTR)"\\\\.\\pipe\\myPipe", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(pipe == INVALID_HANDLE_VALUE)
    return errorMsg();

Моя проблема в том, что независимо от того, какой подход я использую, вызовы open всегда возвращают ошибку «файл не найден». Оба приложения работают под одной учетной записью пользователя в моей 64-битной Windows 7. Чего мне здесь не хватает?

1 Ответ

4 голосов
/ 24 марта 2011
::CreateFile((LPCWSTR)"\\\\.\\pipe\\myPipe", ...)

Это не может работать, вы не можете привести символ * к широкой строке, требуется преобразование.Но здесь нет необходимости, поскольку это строковый литерал.Сделайте литерал Unicode, добавив префикс L

::CreateFile(L"\\\\.\\pipe\\myPipe", ...)

Та же проблема с MMFТакже учтите, что не имеет смысла использовать механизм взаимодействия вне процесса для общения с DLL.Просто загрузите его в процессе.Используйте pinvoke или оболочку C ++ / CLI.

...