获取系统已安装字体?该如何处理

获取系统已安装字体?
本帖最后由 VisualEleven 于 2015-06-08 18:43:47 编辑
去年做的东西,需要获取系统当期已经安装的字体名称,通过查询注册表实现,程序运行正常。但是今天测试莫名其妙不行了。程序已经用管理员身份执行,注册表可以打开,但是RegEnumValue()返回失败,并且返回值每次都不一样:

LONG Ctest::GetNextNameValue(HKEY key, LPCTSTR subkey, LPTSTR szName, LPTSTR szData)
{
HKEY hkey = NULL;
DWORD dwIndex = 0;
LONG retval;

if (subkey == NULL && szName == NULL && szData == NULL)
{
if (hkey)
RegCloseKey(hkey);
hkey = NULL;
return ERROR_SUCCESS;
}

if (subkey && subkey[0] != 0)
{
retval = RegOpenKeyEx(key, subkey, 0, KEY_ALL_ACCESS, &hkey);
if (retval != ERROR_SUCCESS)
{
//TRACE(_T("RegOpenKeyEx failed\n"));
MessageBox(NULL, _T("RegOpenKeyEx failed!"), NULL, 0);
return retval;
}
else
{
MessageBox(NULL, _T("RegOpenKeyEx succeed!"), NULL, 0);
}
dwIndex = 0;
}
else
{
dwIndex++;
}

ASSERT(szName != NULL && szData != NULL);

*szName = 0;
*szData = 0;

TCHAR szValueName[MAX_PATH];
DWORD dwValueNameSize = sizeof(szValueName)-1;
TCHAR  szValueData[MAX_PATH];
DWORD dwValueDataSize = sizeof(szValueData)-1;
DWORD dwType = 0;

memset(szValueName, 0, sizeof(szValueName));
memset(szValueData, 0, sizeof(szValueData));

retval = RegEnumValue(hkey, dwIndex, szValueName, &dwValueNameSize, NULL, 
&dwType, (LPBYTE)szValueData, &dwValueDataSize);
if (retval == ERROR_SUCCESS) 
{
lstrcpy(szName, szValueName);
lstrcpy(szData, szValueData);
}
else
{
CString str;
str.Format(_T("RegEnumValue failed! return value = 0x%x", retval));
MessageBox(NULL, str, NULL, 0);

}
return retval;
}

郁闷阿,请大侠出手。
------解决思路----------------------
出错时,GetLastError获取的错误码是什么
------解决思路----------------------
retval = RegEnumValue(。。。);
这里的retval的返回值是什么?对应的MSDN看看
------解决思路----------------------
EnumFonts
https://msdn.microsoft.com/en-us/library/dd162622
------解决思路----------------------
int CALLBACK EnumFontFamExProc(
   ENUMLOGFONTEX *lpelfe,    // pointer to logical-font data
   NEWTEXTMETRICEX *lpntme,  // pointer to physical-font data
   int FontType,             // type of font
   LPARAM lParam             // application-defined data
   )
{

CEdit* pEdit=(CEdit*)lParam;
lpelfe->elfFullName;
int L=pEdit->GetWindowTextLength();
pEdit->SetSel(L,L);
if(L>0)
{
pEdit->ReplaceSel(_T("\n"));
L=pEdit->GetWindowTextLength();
pEdit->SetSel(L,L);
}
pEdit->ReplaceSel(lpelfe->elfFullName);
return 1;
}

void CEnumFontsTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
LOGFONT lf;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfFaceName[0]=0;
lf.lfPitchAndFamily=0;

CDC* pDC=GetDC();
EnumFontFamiliesEx(pDC->m_hDC,&lf,(FONTENUMPROC)EnumFontFamExProc,(LPARAM)&TxEdit,0);//TxEdit:CEdit类对象
ReleaseDC(pDC);
}