CreateMutex и OpenMutex возвращают NULL - PullRequest
       31

CreateMutex и OpenMutex возвращают NULL

1 голос
/ 23 декабря 2011

Я пишу приложение с общей памятью и создаю именованные мьютексы с соответствующим префиксом "Local\" для имени. Однако каждый раз, когда я вызываю функцию CreateMutex для создания дескрипторов, я получаю возвращаемое значение NULL. Я даже пытаюсь позвонить OpenMutex после этого и получить NULL возврат.

Функция GetLastError() возвращает 6, что означает ERROR_INVALID_HANDLE. Я полагаю, что это происходит с первой попытки создать этот именованный мьютекс в любом процессе. Я включил windows.h после включения некоторых компонентов MFC и использую CMutex в другом месте приложения; так что я не знаю, если это проблема или нет. Я всегда передаю NULL и FALSE для первых двух параметров и использую Windows XP.

Это краткое описание того, что делает мой код:

char to_name[16] = "Local\\to_1";
d_mutex_to_h = CreateMutex(NULL, FALSE, to_name);

if (d_mutex_to_h == NULL)
{
   d_mutex_to_h = OpenMutex(NULL, FALSE, to_name);
}

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Из документации MSDN для CreateMutex :

Если lpName совпадает с именем существующего события, семафора, ожидаемого таймера, задания или объекта отображения файла, функция завершается ошибкой, а функция GetLastError возвращает ERROR_INVALID_HANDLE. Это происходит потому, что эти объекты используют одно и то же пространство имен.

Попробуйте использовать WinObj , чтобы увидеть, есть ли объект без мьютекса с таким же именем.

1 голос
/ 23 декабря 2011

CreateMutex() принимает LPCTSTR в качестве последнего аргумента.Это макрос, который равен LPCWSTR, если определено UNICODE, и LPCSTR в противном случае.Однако вы передаете указатель на строку char.Это может вызвать проблемы, если ваша программа скомпилирована с определением UNICODE.

Попробуйте этот код и посмотрите, изменит ли он что-либо:

d_mutex_to_h = CreateMutex(NULL, FALSE, _T("your_mutex_name_here"));
...