这两天在写老师要求的作业。是一个在EVC下开发的闹钟定制程序。其中一个难点就是如何创建、写、读一个ini 文件。由于是在EVC下,所以很多API函数都不被支持,比如关于.ini文件读写的GetPrivateProfileString和WritePrivateProfileString函数。于是我开始在网上搜寻可以轻松读写ini文件的方法。最后找到了一个人写好的,可以实现类似GetPrivateProfileString功能的函数。我在使用时,发现有一些bug,进行改动后,自己很轻松的使用上了。
GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)。其中参数都是仿造真正的API函数入口参数入手的,但是我在使用中没有发现lpKeyName有任何作用。在我使用时用了个全局变量实现的lpKeyName。具体函数内容和我个人对他理解到的注解在下面,对我理解错误的地方请多指教。
DWORD CClockToolDlg::GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)
{
CFile iniFile;
PBYTE pFileBuf;
CString szBuf;
DWORD dwLength;
if (lpFileName == NULL || lpReturnedString == NULL)
{
return 0;
}
*lpReturnedString = TCHAR('/0');
nSize = 0;
//打开文件不成问题
if(!iniFile.Open(lpFileName, CFile::modeRead))
{
return 0;
}
dwLength = iniFile.GetLength();
if (dwLength == 0)
{
return 0;
}
pFileBuf = new BYTE[dwLength + 2];
if (pFileBuf == NULL)
{
return 0;
}
//初始化新分配的内存,设定初始值为0
memset(pFileBuf, 0x0, dwLength + 2);
iniFile.Read((void *)pFileBuf, dwLength);
iniFile.Close();
if (pFileBuf[0] == 0xFF && pFileBuf[1] == 0xFE)
{
szBuf = (LPCWSTR)(pFileBuf + 2);
}
else
{
PTCHAR pszWideChar = new TCHAR[dwLength + 1];
MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS|MB_COMPOSITE|MB_USEGLYPHCHARS, (LPCSTR )pFileBuf, dwLength, pszWideChar,dwLength);
//以下为我修改过的地方。因为我一点一点测试这个别人写的函数程序的时候,发现这里出了问题。于是我进行了修改,不过我认为我的修改并不好
char string[500];
int i=0;
while(i<dwLength)
{
string[i]=pszWideChar[i];
i++;
}
szBuf.Format(_T("%s"),string);
//
delete pszWideChar;
}
delete pFileBuf;
while (1)
{
CString szTemp;
int nPos;
if (szBuf.IsEmpty())
goto _GetPrivateProfileString_EXIT;
nPos = szBuf.FindOneOf(TEXT("/r/n"));
if (nPos == -1)
{
szTemp = szBuf;
szBuf.Empty();
//szTemp='['
//::AfxMessageBox(szTemp);
}
else
{
szTemp = szBuf.Left(nPos);
szBuf = szBuf.Right(szBuf.GetLength() - nPos);
szBuf.TrimLeft(TEXT("/r/n"));
}
szTemp.TrimLeft(TEXT("/t "));
szTemp.TrimRight(TEXT("/t "));
if (szTemp.GetAt(0) == TEXT('[') && szTemp.GetAt(szTemp.GetLength() - 1) == TEXT(']'))
{
szTemp = szTemp.Right(szTemp.GetLength() - 1);
szTemp = szTemp.Left(szTemp.GetLength() - 1);
如果没有[]
if (lpAppName == NULL)
{
memcpy(lpReturnedString + nSize, (LPCTSTR)szTemp,(szTemp.GetLength() + 1)* sizeof(TCHAR));
nSize += szTemp.GetLength() + 1;
}
//如果有[]
else if(szTemp.Compare(lpAppName) == 0)
{
while (1)
{
if (szBuf.IsEmpty())
{
///这里是我用来实现lpDefault功能的一个全局变量,呵呵
hubo=1;
///
goto _GetPrivateProfileString_EXIT;
}
nPos = szBuf.FindOneOf(TEXT("/r/n"));
if (nPos == -1)
{
szTemp = szBuf;
szBuf.Empty();
}
else
{
szTemp = szBuf.Left(nPos);
szBuf = szBuf.Right(szBuf.GetLength() - nPos);
szBuf.TrimLeft(TEXT("/r/n"));
}
nPos = szTemp.Find(TEXT("="));
if (nPos == -1)
goto _GetPrivateProfileString_EXIT;
CString szTemp1;
szTemp1 = szTemp.Left(nPos);
szTemp1.TrimLeft(TEXT("/t "));
szTemp1.TrimRight(TEXT("/t "));
if (lpKeyName == NULL)
{
memcpy(lpReturnedString + nSize, (LPCTSTR)szTemp1,(szTemp1.GetLength() + 1)* sizeof(TCHAR));
nSize += szTemp1.GetLength() + 1;
}
else if (szTemp1.Compare(lpKeyName) == 0)
{
szTemp1 = szTemp.Right(szTemp.GetLength() - nPos - 1);
szTemp1.TrimLeft(TEXT("/t "));
szTemp1.TrimRight(TEXT("/t "));
memcpy(lpReturnedString + nSize, (LPCTSTR)szTemp1,(szTemp1.GetLength() + 1)* sizeof(TCHAR));
nSize += szTemp1.GetLength() + 1;
goto _GetPrivateProfileString_EXIT;
}
///
esle if(szTemp1.Compare(lpKeyName) != 0)
{
hubo=1;
goto _GetPrivateProfileString_EXIT;
}
//
}
}
}
}
_GetPrivateProfileString_EXIT:
lpReturnedString[nSize] = TEXT('/0');
return nSize;
}