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
был определен как макрос и некоторые другие параметры проекта, что приводило к непредсказуемому поведению всего кода.