2011-01-14 3 views
0

Im создает DLL, которая разделяет память между различными приложениями.CreateFileMapping() name

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

#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"); 

Как я могу получить эту работу с массив символов?

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

+0

Что такое значение массив символов ('name') вы передаете в' create'? Каково значение возвращаемого значения и код ошибки (вы можете получить его с помощью «GetLastError») «CreateFileMapping», когда он терпит неудачу? –

+0

Что вы передаете как параметр для создания функции? – Elalfer

+0

Я передаю {'T', 'E', 'S', 'T'}, это не подводит, но я не могу открыть пространство разделяемой памяти позже в другом приложении. – sigvardsen

ответ

2

Я полагаю, вы должны увеличить значение 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'}

+0

Спасибо, я увеличил размер, но для меня кажется нелогичным, что он должен иметь «\ 0» в качестве последнего символа. – sigvardsen

+0

вы можете прочитать здесь http://en.wikipedia.org/wiki/C_string, чтобы найти дополнительную информацию о строках в C – Elalfer

+0

Вы написали, что у вас есть exp. с Java. Вот почему это немного, но смущает для вас.Java использует строку с нулевым завершением внутри виртуальной машины и переносит ее в класс строки Java. – Elalfer

1

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

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

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

Смежные вопросы