После выделения памяти для параметра wchar_t* и копирования строки в буфер при возврате из функции буфер не может быть прочитан. Для отладчика:
machineName 0xcccccccccccccccc wchar_t *
с учетом следующего кода
wchar_t *machineName;
EXPECT_TRUE(c_GetMachineName(machineName));
файл test.cpp
...
#include "sysCertStore.h"
TEST(sysCertStoreC, c_GetMachineName)
{
wchar_t *machineName;
EXPECT_TRUE(c_GetMachineName(machineName));
setlocale(LC_ALL, "");
printf("%ls", machineName);
free(machineName);
}
файл sysCertStore.h
...
#ifdef __cplusplus
extern "C"
{
// only need to export C interface if
// used by C++ source code
BOOL c_GetMachineName(wchar_t* machineName);
};
#endif
файл sysCertStore.cpp
...
BOOL c_GetMachineName(wchar_t* machineName) {
wchar_t Name[MAX_COMPUTERNAME_LENGTH + 1];
int i = 0;
LPWSTR infoBuf = new wchar_t[MAX_COMPUTERNAME_LENGTH + 1]; // = {'\0'};
DWORD bufCharCount = MAX_COMPUTERNAME_LENGTH + 1;
memset(Name, 0, MAX_COMPUTERNAME_LENGTH + 1);
if (GetComputerNameW(infoBuf, &bufCharCount))
{
for (i = 0; i < MAX_COMPUTERNAME_LENGTH + 1; i++)
{
Name = infoBuf;
}
delete[] infoBuf;
INT strln= wcslen(Name)+1;
machineName = (wchar_t*)malloc(strln * sizeof(wchar_t)); // new wchar_t[strln];
wcscpy_s(machineName, strln, Name);
return TRUE;
} else
{
wcscpy_s(Name,7+1, L"Unknown");
return FALSE;
}
return FALSE;
}
Я ожидаю, что тест напечатает имя машины и освободит память выделенной строки/буфера, выделенную в функции c_GetMachineName.
TEST(sysCertStoreC, c_GetMachineName)
{
wchar_t *machineName;
EXPECT_TRUE(c_GetMachineName(machineName));
setlocale(LC_ALL, "");
printf("%ls", machineName);
free(machineName);
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... the-string