Имя CreateFileMapping () - PullRequest
       8

Имя CreateFileMapping ()

0 голосов
/ 14 января 2011

Я создаю DLL, которая разделяет память между различными приложениями.

Код, который создает общую память, выглядит следующим образом:

#define NAME_SIZE 4
HANDLE hSharedFile;

create(char[NAME_SIZE] name)
{
    hSharedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, (LPCSTR)name);
    (...) //Other stuff that maps the view of the file etc.
}

Он не работает.Однако, если я заменю name на строку, она будет работать:

SharedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, (LPCSTR)"MY_TEST_NAME");

Как мне заставить это работать с массивом char?

У меня есть Java-фон, где вы просто используетеСтрока все время, что такое LPCSTR?И связано ли это с тем, использует ли мой проект MS VC ++ Unicode или Multi-Byte набор символов

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Полагаю, вам следует увеличить значение NAME_SIZE.

Не забывайте, что массив должен содержать хотя бы количество символов + 1, чтобы в конце содержалось \ 0 символов, что показывает конец строки.

LPCSTR - указатель на константу с нулевым символом в конце, состоящую из 8-битных символов Windows (ANSI), определяемый следующим образом:

LPCSTR defined as typedef __nullterminated CONST CHAR *LPCSTR; 

Например, даже если у вас "Hello world" константаи он имеет 11 символов, он займет 12 байтов в памяти.

Если вы передаете строковую константу в виде массива, вы должны добавить '\ 0' в конец как {'T','E','S','T', '\0'}

1 голос
/ 14 января 2011

Если вы посмотрите на документацию, то обнаружите, что большинство функций Win32 принимают LPCTSTR, что представляет собой строку TCHAR. В зависимости от того, используете ли вы Unicode (по умолчанию) или ANSI, TCHAR расширится до wchar_t или char. Кроме того, LPCWSTR и LPCSTR явно представляют строки Unicode и ANSI соответственно.

Когда вы разрабатываете для Win32, в большинстве случаев лучше следовать примеру и использовать LPCTSTR везде, где вам нужны строки, вместо явных char массивов / указателей. Кроме того, используйте макрос TEXT("...") для создания правильного типа строковых литералов вместо просто "...".

В вашем случае, однако, я сомневаюсь, что это вызывает проблему, поскольку оба ваших примера используют только LPCSTR. Вы также определили NAME_SIZE как 4, может быть, ваш массив слишком мал для размещения нужной вам строки?

...