Междупроцесна комуникация с помощта на MemoryMappedFiles или Named Pipes във VC++ и C# в Windows 7

Опитвам се да комуникирам между 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();

Проблемът ми е, че независимо кой подход използвам, отворените извиквания винаги връщат грешка „файлът не е намерен“. И двете приложения работят под един и същ потребителски акаунт на моя 64-битов Windows 7. Какво пропускам тук?


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


Отговори (1)


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

Това не може да работи, не можете да прехвърлите char* към широк низ, необходимо е преобразуване. Но не е необходимо тук, тъй като това е низов литерал. Направете го unicode литерал, като поставите префикс L

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

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

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