3648|3

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求教在WinCE中ini文件的写法 [复制链接]

各位高手,我想在*.ini文件里面把画面上的按钮大小,字体等属性写出来。请问该怎么写?格式是什么?

最新回复

请到我的个人博客去看下,那里有在CE中实现ini操作的源代码。 http://blog.eeworld.net/benkaoya/archive/2008/01/28/2070648.aspx  详情 回复 发表于 2008-3-11 08:49
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个代码可以参考一下:

#define  MAX_LEN   1000      ///用于CString,使用CString类前最好估算整个操作过程中可能出现的最大
                             ///字符长度,用GetBuffer(MAX_LEN)来创建缓冲区。这将避免频繁创建、删除
                             ///缓冲区,提高了效率,也避免了内存碎片。
CString  strIniPath = L"\\hard disk\\user.ini";  ///全局变量,预先设置一个文件路径。
                                                 ///文件路径没有盘符,如C:\ 、D:\ 。
                                                 ///必须为绝对路径,CE下没相对路径概念。

BOOL  WriteProfileString(const CString strSection, const CString strEntry, const CString strValue)
{
        ////先判断所有参数是否为空
        if(strSection == L"" || strEntry == L"" || strValue == L"")
        {
                return FALSE;
        }
        CFile    IniFile;
        CString  strCombine;

        TRY
        {
                ////打开文件
                if(! IniFile.Open(strIniPath, CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate))
                {
                        return FALSE;
                }
                ///判断文件是否为空,为空则直接写数据,就不必先把文件内容读出来。
                if(IniFile.GetLength() == 0)
                {
                        strCombine = L"[" + strSection + L"]" + L"\r\n"
                                         + strEntry + L"=" + strValue + L"\r\n";
                        ///得到strCombine包含的缓冲区首地址(方法有两种)                                               
                        LPTSTR  lpCombine = strCombine.GetBuffer(0);  
                        IniFile.Write(lpCombine, strCombine.GetLength() * 2);
                        IniFile.Close();
                        return TRUE;
                }
                ///读出文件所有数据到缓冲区
                WCHAR  *pBuf;
                pBuf = new WCHAR[IniFile.GetLength() / 2 + 1];  ///文件内容为UNICODE,所以文件长度一定是2的倍数
                if(pBuf == NULL)
                {
                        IniFile.Close();
                        return FALSE;
                }
                if(IniFile.Read(pBuf, IniFile.GetLength()) != IniFile.GetLength())
                {
                        delete[]  pBuf;
                        IniFile.Close();
                        return FALSE;
                }
                ///把缓冲区地址赋给CString对象,为了使用CString包含的函数。
                ///一般Ini文件比较小,所以从缓冲区到CString的复制过程用时很短、耗费资源也很少
                pBuf[IniFile.GetLength() / 2] = NULL;
                strCombine.GetBuffer(MAX_LEN);   ///先创建大的缓冲区
                strCombine = pBuf;
                delete[]   pBuf;

                //////开始查找,看section和entry是否已经存在
                int iIndex1, iIndex2, iIndex3, iIndexT;   
                iIndex1 = strCombine.Find(L"[" + strSection + L"]\r\n");
                if(iIndex1 == -1)  ///没找到
                {
                        strCombine += L"[" + strSection + L"]" + L"\r\n"
                                          + strEntry + L"=" + strValue + L"\r\n";
                        ///得到strCombine包含的缓冲区首地址
                        LPTSTR  lpCombine = strCombine.GetBuffer(0);
                        IniFile.SetLength(0);   ///删除原来数据
                        IniFile.SeekToBegin();
                        IniFile.Write(lpCombine, strCombine.GetLength() * 2);
                        IniFile.Close();
                        return TRUE;
                }
                iIndexT = iIndex1 + 4 + strSection.GetLength();
                iIndex2 = strCombine.Find(strEntry + L"=", iIndexT);
                if(iIndex2 == -1)  ///没找到
                {
                        strCombine.Insert(iIndexT, strEntry + L"=" + strValue + L"\r\n");
                        ///得到strCombine包含的缓冲区首地址
                        LPTSTR  lpCombine = strCombine.GetBuffer(0);
                        IniFile.SetLength(0);
                        IniFile.SeekToBegin();
                        IniFile.Write(lpCombine, strCombine.GetLength() * 2);
                        IniFile.Close();
                        return TRUE;
                }
                else
                {
                        iIndex3 = strCombine.Find(L"\r\n", iIndex2 + 1);
                        if(iIndex3 == -1)
                        {
                                IniFile.Close();
                                return FALSE;
                        }
                        iIndexT = iIndex2 + 1 + strEntry.GetLength();
                        strCombine.Delete(iIndexT, iIndex3 - iIndexT);
                        strCombine.Insert(iIndexT, strValue);
                        ///得到strCombine包含的缓冲区首地址
                        LPTSTR  lpCombine = strCombine.GetBuffer(0);
                        IniFile.SetLength(0);  
                        IniFile.SeekToBegin();
                        IniFile.Write(lpCombine, strCombine.GetLength() * 2);
                        IniFile.Close();
                        return TRUE;
                }
               
        } ///end TRY
        CATCH(CFileException, e)
        {
/*                ////用于调试,得到出错信息
                CString strT;
                switch(e->m_cause)
                {
                case CFileException::generic:
                case CFileException::badPath:
                case CFileException::accessDenied:
                case CFileException::hardIO:
                case CFileException::diskFull:
                ...............
                default:
                }
*/        }
        END_CATCH     ///结束调试宏
       
        IniFile.Close();  
        return FALSE;
}


CString GetProfileString(const CString strSection, const CString strEntry, const CString strDefault)
{
        ////先判断前两个参数是否为空
        if(strSection == L"" || strEntry == L"")
        {
                return strDefault;   ///不成功则返回默认值
        }
        CFile    IniFile;
        CString  strCombine;

        TRY
        {
                ////打开文件
                if(! IniFile.Open(strIniPath, CFile::modeRead))
                {
                        return strDefault;
                }
                ///判断文件是否为空
                if(IniFile.GetLength() == 0)
                {
                        IniFile.Close();
                        return strDefault;
                }
                ///读出文件所有数据到缓冲区
                WCHAR  *pBuf;
                pBuf = new WCHAR[IniFile.GetLength() / 2 + 1];  
                if(pBuf == NULL)
                {
                        IniFile.Close();
                        return strDefault;
                }
                if(IniFile.Read(pBuf, IniFile.GetLength()) != IniFile.GetLength())
                {
                        delete[]  pBuf;
                        IniFile.Close();
                        return strDefault;
                }
                pBuf[IniFile.GetLength() / 2] = NULL;
                strCombine.GetBuffer(MAX_LEN);   ///先创建大的缓冲区
                strCombine = pBuf;
                delete[]   pBuf;

                //////开始查找,看section和entry是否已经存在
                int iIndex1, iIndex2, iIndex3, iIndexT;   
                iIndex1 = strCombine.Find(L"[" + strSection + L"]\r\n");
                if(iIndex1 == -1)  ///没找到
                {
                        IniFile.Close();
                        return strDefault;
                }
                iIndexT = iIndex1 + 4 + strSection.GetLength();
                iIndex2 = strCombine.Find(strEntry + L"=", iIndexT);
                if(iIndex2 == -1)  ///没找到
                {
                        IniFile.Close();
                        return strDefault;
                }
                else
                {
                        iIndex3 = strCombine.Find(L"\r\n", iIndex2 + 1);
                        if(iIndex3 == -1)
                        {
                                IniFile.Close();
                                return strDefault;
                        }
                        iIndexT = iIndex2 + 1 + strEntry.GetLength();
                        IniFile.Close();
                        return  strCombine.Mid(iIndexT, iIndex3 - iIndexT);
                }
        }
        CATCH(CFileException, e)
        {               
        }
        END_CATCH      ///结束调试宏
       
        IniFile.Close();  
        return strDefault;
}
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在VB.net中也用到上述API的函数,运行时提示找不到Kernel32.dll,有知道如何加载dll的大侠吗?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
请到我的个人博客去看下,那里有在CE中实现ini操作的源代码。
http://blog.eeworld.net/benkaoya/archive/2008/01/28/2070648.aspx
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表