2011-01-14 3 views
0

다른 응용 프로그램간에 메모리를 공유하는 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"); 

가 어떻게이 char 배열 작업을 얻을 수 있나요?

나는 항상 문자열을 사용할 Java 배경을 가지고 있는데, LPCSTR은 무엇입니까? 그리고 이것은 내 MS VC++ 프로젝트 Unicode을 사용하는지 여부에 관계 또는 Multi-Byte 문자를 사용하면 문서를 보면, 대부분의 Win32 함수가 TCHAR의 문자열을 나타내는 LPCTSTR를 취할 것을 찾을 수 있습니다

+0

문자 배열 ('name') 당신은'create'에 전달하는 가치는 무엇인가처럼 마지막에 '\ 0'을 추가해야 배열로 상수 문자열을 전달하는 경우? 실패했을 때'CreateFileMapping'의 리턴 값과 에러 코드 ('GetLastError'로 얻을 수 있습니다)는 무엇입니까? –

+0

함수를 만들기 위해 매개 변수로 무엇을 전달합니까? – Elalfer

+0

{ 'T', 'E', 'S', 'T'}를 전달하고 있지만 실패하지는 않지만 나중에 다른 앱에서 공유 메모리 공간을 열 수 없습니다. – sigvardsen

답변

2

NAME_SIZE 값을 늘려야한다고 가정합니다.

배열의 끝에는 \ 0 char가 있어야하며 행의 끝을 나타내는 최소한 chars 수 +1이어야합니다.

LPCSTR 8 비트 Windows (ANSI) 문자의 일정한 null로 종료 된 문자열에 대한 포인터이며, 정의를 다음과 같이 예를 들어

LPCSTR defined as typedef __nullterminated CONST CHAR *LPCSTR; 

당신이 "Hello world" 일정이 있더라도 그것은 11 개 문자가 그것을 메모리에서 12 바이트를 차지합니다.

당신이 {'T','E','S','T', '\0'}

+0

고마워, 나는 크기를 늘 렸지만 나에게는 마지막 문자로 '\ 0'이 있어야한다는 것은 비 논리적인 것처럼 보인다. – sigvardsen

+0

C에서 문자열에 대한 자세한 정보는 http://en.wikipedia.org/wiki/C_string 여기에서 읽을 수 있습니다 – Elalfer

+0

당신은 특급이 있다고 썼습니다. 자바와. 이것이 당신에게 조금 혼란스러운 이유입니다.Java는 VM 내에서 null로 끝나는 문자열을 사용하여 Java 문자열 클래스로 래핑합니다. – Elalfer

1

를 설정 않습니다. 유니 코드 (기본값) 또는 ANSI 사용 여부에 따라 TCHARwchar_t 또는 char으로 확장됩니다. 또한 LPCWSTRLPCSTR은 각각 유니 코드 및 ANSI 문자열을 명시 적으로 나타냅니다.

Win32 용으로 개발할 때는 대개 char 배열/포인터 대신에 문자열이 필요한 곳이면 어디든 LPCTSTR을 사용하는 것이 가장 좋습니다. 또한 TEXT("...") 매크로를 사용하여 "..." 대신 올바른 종류의 문자열 리터럴을 만들 수 있습니다.

두 경우 모두 LPCSTR 만 사용하고 있기 때문에 문제가 될 수 있습니다. NAME_SIZE을 4로 정의했기 때문에 배열이 너무 작아서 원하는 문자열을 유지할 수 없습니까?

관련 문제