Sampath579 Ответов: 1

Сбой Copymemory, когда std::string содержит более 5L символов


Привет
Я хочу скопировать строковые данные в общую память несколько раз с помощью функции CopyMemory(). Но этот вызов сохраняет только последние строковые данные и очищает существующие. Конечно, это соответствует дизайну. Но кто-нибудь даст мне знать, как скопировать строковые данные в общую память, используя любой другой альтернативный api, который не должен переопределять существующие данные.

У меня есть строка std::, в которой есть почти 5Lakh символов. Когда я пытаюсь скопировать эту строку в общую память она терпит крах

HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, wstring{ L"Local\\StringData_" + to_wstring(GetParentID()) }.data());
				m_pStringBuf = (LPCTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
				CopyMemory((PVOID)m_pStringBuf, st.data(), (st.size()+1) * sizeof(TCHAR));


Вместо того чтобы копировать st.data() за один раз, я хочу скопировать данные, когда когда-либо получу их, чтобы строка содержала меньше данных и не происходило сбоя.

Любые предложения, пожалуйста.

Что я уже пробовал:

Попробовал сам и погуглил, но не нашел правильного ответа.

Что-то здесь не так, который рушится на copymemory, за()

std::string m_strData;
	std::string ch = "s";
	for (long long i = 0; i < 500000; i++)
	{
		m_strData.append(ch);
	}
	long BUF_SIZE = (long)(sizeof(TCHAR) * (m_strData.size() + 1));

	HANDLE hMapFilesize = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(long), { L"Local\\AECData_BufferSize_" });
	long *m_pAECBufferSize = reinterpret_cast<long*>(MapViewOfFile(hMapFilesize, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(long)));
	CopyMemory((PVOID)m_pAECBufferSize, &BUF_SIZE, sizeof(long));

	HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, { L"Local\\AECPropertiesAndLinkages_" });
	LPTSTR m_pAECQuantityBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
	CopyMemory((PVOID)m_pAECQuantityBuf, m_strData.data(), (m_strData.size() + 1) * sizeof(TCHAR));

Sampath579

Наконец - то я смог разобраться в этом вопросе самостоятельно. :)

KarstenK

Так что запишите его как ответ, чтобы решить вопросы и ответы.

1 Ответов

Рейтинг:
10

Sampath579

Ниже фрагмент кода работает

long BUF_SIZE = (long)((m_strData.size() + 1));

CopyMemory((PVOID)m_pAECQuantityBuf, m_strData.data(), (m_strData.size() + 1));