Взаимодействие между процессами с использованием MemoryMappedFiles или Named Pipes в VC++ и C# в Windows 7

Я пытаюсь установить связь между DLL VC++ и приложением 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();

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


person svens    schedule 24.03.2011    source источник


Ответы (1)


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

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

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

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

person Hans Passant    schedule 24.03.2011
comment
Большое спасибо, это решило проблему. DLL загружается другим процессом, я думаю, что у меня нет других вариантов. - person svens; 25.03.2011