2013-01-22 70 views
0

WriteProfileString方法不同,GetProfileString方法不提供检查段中或选项是否存在于配置文件中的方法。我所能得到的只是一个默认字符串。我想实现我的代表型材一类,我想有一个使用CWinApp :: GetProfileString()时检查段/选项是否存在

BOOL HasSection(CString sSection) 

并在它的

BOOL HasOption(CString sSection, CString sOption) 

方法。

+0

您可能需要通过阅读注册表(或者如果您通过自己解析.ini文件来使用.ini文件,这非常简单)来实现此目的。 –

+0

的确如此,但只是失去了一般性。如果Microsoft更改配置文件字符串的保存方式,我必须修改这些方法。 – koloman

回答

1

这很容易做到。请仔细阅读MSDN Article。请注意,当您将NULL传递给第一个或第二个参数时,函数将返回所有节名称(在前一种情况下)或键(在后一种情况下)的列表。

所以为你实现HaseOption()方法中,你将不得不与此类似代码:

BOOL HasSection(CString sSection) 
{ 
    DWORD dwSize = 100, dwRequired; 
    LPTSTR lpBuffer = new TCHAR[dwSize]; 
    BOOL bExists = FALSE; 

    dwRequired = ::GetProfileString(NULL, NULL, _T(""), lpBuffer, dwSize); 
    while(dwRequired == dwSize - 2) 
    { 
     // buffer is too small 
     delete [] lpBuffer; 

     dwSize = dwRequired + 100; 
     lpBuffer = new TCHAR[dwSize]; 
     dwRequired = ::GetProfileString(NULL, NULL, _T(""), lpBuffer, dwSize); 
    } 
    if(dwRequired) 
    { 
     LPTSTR lpszFound = lpBuffer; 
     do 
     { 
      if(sSection.CompareNoCase(lpszFound) == 0) 
      { 
       bExists = TRUE; break; 
      } 
     } while(*(lpszFound = _tcsninc(lpszFound, _tcsnbcnt(lpszFound, dwRequired)+1))); 
    } 
    delete [] lpBuffer; 
    return bExists; 
} 

我没有测试代码,只是从我的计划削减正粘贴和修改了一下。请自行测试代码

+1

谢谢cha!你的代码非常有帮助!它只是有一个小错误:'_tcsinc'没有遍历所有选项,而是遍历第一个选项的所有字符。我通过修改do-while循环中的条件来解决这个问题。 – koloman