OpenFileMapping() не может найти MMF, созданный в COM DLL

контекст

Я пытаюсь отправить данные изображения во время выполнения из приложения C++ .exe в исходный фильтр DirectShow, реализованный в виде COM DLL. Чтобы сделать это, я пытаюсь использовать отображенные в памяти файлы для выполнения IPC, используя слегка измененную версию кода, взятого отсюда. Все клиенты и серверы используют одинаково ipc.c а также ipc.h,

hFile = INVALID_HANDLE_VALUEи я позволяю использовать внешнюю строку для lpName,

сервер

Я установил отладчик DLL на Command -> lync.exe а также Debugger Type -> Mixed, что позволяет мне отладить фактическое использование фильтра. Создание сервера (статический экземпляр с областью действия) завершается успешно и возвращает допустимый дескриптор.

HRESULT CVSourceStream::FillBuffer(IMediaSample *pms) {
    static osIPC::Server server(IPC_SERVER_ADDR); // filename shared by client/server   
    ... // set timestamp on sample
    BYTE *pData;
    pms->GetPointer(&pData);
    server.read(&pData, IPC_BLOCK_SIZE);
    return S_OK;
}

клиент

Тем не менее, когда я пытаюсь открыть сопоставление файлов при создании osIPC::Client экземпляр в моем приложении, OpenFileMapping() вызов не выполняется путем возврата NULLс последним кодом ошибки ERROR_FILE_NOT_FOUND,

osIPC::Client client(IPC_SERVER_ADDR); // class instance member

тестирование

Для тестирования я написал облегченную пару клиент-серверных решений Visual Studio, каждое из которых имеет соответствующие типы инициализации (нестатическая / статическая). Каждое решение в основном просто main() это создает osIPC::Client или же osIPC::Server затем пропускает байтовые буферы. Здесь OpenFileMapping() вызов выполнен.

Запуск моего приложения в сочетании с облегченным сервером завершился успешно, но объединение DLL с облегченным клиентом не удалось, из-за чего я предположил, что фильтр вызывает проблемы.

Я пытался добавить Global\\ к имени файла, переданного в CreateFileMapping() вызов, чтобы использовать глобальное пространство имен без результатов.

Вопрос

TL;DR: есть четкое объяснение того, почему отображенный в памяти файл создан CreateFileMapping() в моей DLL, которая загружается Lync.exe, кажется, не видна моему клиентскому приложению, вызывая OpenFileMapping() потерпеть неудачу с кодом ошибки ERROR_FILE_NOT_FOUND?

1 ответ

Решение

Как отметил @Hans Passant, ссылочный код сделал небезопасный тип из char * в LPWSTR, Путем явного указания моих собственных строк Unicode и настройки конструкторов и типов внутренних переменных для osIPC::Client а также osIPC::ServerМне удалось заставить работать IPC.

В зависимости от того UNICODE был определен как макрос и некоторые другие параметры проекта, что приводило к непредсказуемому поведению всего кода.

Другие вопросы по тегам