Имеем два массива, один из которых динамический. К этому динамическому массиву нужно дописать второй. Вот собственно реализация.
Флаги нужны для того, чтобы убрать ненужные нулевые байты (концы строк) и соответственно, сменить количество скопированных байт.
Функция также НЕ выделяет дополнительный объем памяти на всякий случай. Тоесть ровно столько, сколько нужно.
Флаги нужны для того, чтобы убрать ненужные нулевые байты (концы строк) и соответственно, сменить количество скопированных байт.
Функция также НЕ выделяет дополнительный объем памяти на всякий случай. Тоесть ровно столько, сколько нужно.
Код:
#define DATA_TYPE_BINARY 0
#define DATA_TYPE_WIDECHAR 2
#define DATA_TYPE_CHAR 3
LPVOID memcnc(LPVOID dest, LPCVOID data, LPDWORD destSize, const DWORD dataSize, int dataType)
{
LPVOID tmp = NULL;
HANDLE hHeap = GetProcessHeap();
DWORD resultSize = *destSize + dataSize;
char* dest_char = (char*)dest;
if (destSize && dest)
{
if (hHeap == INVALID_HANDLE_VALUE)
return NULL;
tmp = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, *destSize);
if (!tmp)
return NULL;
memcpy(tmp, dest, *destSize);
if (!HeapFree(hHeap, HEAP_NO_SERIALIZE, dest))
{
HeapFree(hHeap, HEAP_NO_SERIALIZE, tmp);
return NULL;
}
dest = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, resultSize);
if (!dest)
{
HeapFree(hHeap, HEAP_NO_SERIALIZE, tmp);
return NULL;
}
memcpy(dest, tmp, *destSize);
dest_char = (char*)dest +(*destSize);
switch (dataType)
{
case DATA_TYPE_CHAR:
resultSize -= sizeof(char)*2;
dest_char -= sizeof(char);
break;
case DATA_TYPE_WIDECHAR:
resultSize -= sizeof(wchar_t)*2;
dest_char -= sizeof(wchar_t);
break;
}
memcpy(dest_char, data, dataSize);
*destSize = resultSize;
return dest;
}
else
{
dest = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, dataSize);
if (!dest)
return NULL;
memcpy(dest, data, dataSize);
*destSize = dataSize;
return dest;
}
}