CreateFileMapping()名称

时间:2011-01-14 17:32:14

标签: c++ character-encoding char

我正在创建一个在不同应用程序之间共享内存的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 个答案:

答案 0 :(得分:2)

我想你应该增加NAME_SIZE值。

不要忘记,数组必须至少包含字符数+ 1才能在结尾处保存\ 0 char,这表示该行的结尾。

LPCSTR是一个指向8位Windows(ANSI)字符的以空字符结尾的常量字符串的指针,定义如下:

LPCSTR defined as typedef __nullterminated CONST CHAR *LPCSTR; 

例如,即使你有"Hello world"常量且它有11个字符,它也需要内存中的12个字节。

如果要将字符串常量作为数组传递,则必须将“\ 0”添加到末尾,如{'T','E','S','T', '\0'}

答案 1 :(得分:1)

如果查看文档,您会发现大多数Win32函数都使用LPCTSTR,它表示TCHAR的字符串。根据您使用的是Unicode(默认值)还是ANSI,TCHAR将扩展为wchar_tchar。此外,LPCWSTRLPCSTR分别明确表示Unicode和ANSI字符串。

当你为Win32开发时,在大多数情况下,最好跟随并在任何需要字符串的地方使用LPCTSTR,而不是显式的char数组/指针。此外,使用TEXT("...")宏来创建正确类型的字符串文字,而不仅仅是"..."

在您的情况下,我怀疑这会导致问题,因为您的示例仅使用LPCSTR。您还将NAME_SIZE定义为4,可能是您的数组太小而无法容纳您想要的字符串吗?