我正在创建一个在不同应用程序之间共享内存的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
字符集有关?
答案 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_t
或char
。此外,LPCWSTR
和LPCSTR
分别明确表示Unicode和ANSI字符串。
当你为Win32开发时,在大多数情况下,最好跟随并在任何需要字符串的地方使用LPCTSTR
,而不是显式的char
数组/指针。此外,使用TEXT("...")
宏来创建正确类型的字符串文字,而不仅仅是"..."
。
在您的情况下,我怀疑这会导致问题,因为您的示例仅使用LPCSTR
。您还将NAME_SIZE
定义为4,可能是您的数组太小而无法容纳您想要的字符串吗?