获取系统已安装字体?

alexander_david 2015-06-08 06:09:53
去年做的东西,需要获取系统当期已经安装的字体名称,通过查询注册表实现,程序运行正常。但是今天测试莫名其妙不行了。程序已经用管理员身份执行,注册表可以打开,但是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;
}

郁闷阿,请大侠出手。
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexander_david 2015-06-09
  • 打赏
  • 举报
回复
谢谢各位,有两个静态局部变量,我写成局部变量了。 static HKEY hkey = NULL; static DWORD dwIndex = 0; 谢谢。
worldy 2015-06-08
  • 打赏
  • 举报
回复
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);
}
alexander_david 2015-06-08
  • 打赏
  • 举报
回复
谢谢各位热心。 刚才看了一下RegEnumValue(),返回值表示是无效的句柄,估计是这个函数第一个参数有问题。 另外发现,上面的程序在大多数系统是正常工作的,估计是某些系统的注册表有问题,同时上面的代码逻辑不完善导致输入参数无效。 我先回去了。谢谢各位。
zwfgdlc 2015-06-08
  • 打赏
  • 举报
回复
Eleven 2015-06-08
  • 打赏
  • 举报
回复
retval = RegEnumValue(。。。); 这里的retval的返回值是什么?对应的MSDN看看
alexander_david 2015-06-08
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
出错时,GetLastError获取的错误码是什么
是0. 谢谢回复。
oyljerry 2015-06-08
  • 打赏
  • 举报
回复
出错时,GetLastError获取的错误码是什么
alexander_david 2015-06-08
  • 打赏
  • 举报
回复
上面函数来自网页: http://bbs.csdn.net/topics/300225641 系统是win7,vc2008

16,372

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧