gtabbs吧 关注:2,631贴子:16,533
  • 3回复贴,共1

CLEO4之浅析IniFiles.cleo源码

只看楼主收藏回复

原创教程,请尊重我的劳动
.cleo提供了非常强大的功能,在cleo4中最耀眼的无非FileSystemOperations.cleo IniFiles.cleo IntOperations.cleo,这里就来同大家交流一下iniflies.cleo的具体实现
官方的CLEO_SDK文件中就已经包含了每个.cleo的源码,这里取和谐文件opcodes.c来解析一下
需要注意的是opcodes.c必须要包含cleo.h,opcodes.h等头文件,当然你可以把头文件中的函数声明宏定义等全部复制到opcodes.c,但目测这样源码将会非常含糊,不建议此操作


IP属地:中国香港1楼2013-08-19 15:50回复
    度娘格式奇葩
    #include "stdafx.h" //windows api需要包含的head
    #include "CLEO.h" //包含cleo.h,cleo.h里宏定义了很多内容,下文中使用的CLEO_GetVersion()等必须要有宏定义的内容
    //开始宏定义操作码,后面为opcodes的对应标示符
    #define OPCODE_INIFILE_GET_INT0x0AF0 //0AF0是读取指定目录的ini中一个int型并定义为新的局部变量
    #define OPCODE_INIFILE_WRITE_INT0x0AF1 //0AF1是写入int类型到指定目录的ini文件
    #define OPCODE_INIFILE_GET_FLOAT0x0AF2 //0AF2是读取指定目录的ini中一个float型并定义为新的局部变量
    #defineOPCODE_INIFILE_WRITE_FLOAT0x0AF3 //0AF3是写入float类型到指定目录的ini文件 #defineOPCODE_INIFILE_READ_STRING0x0AF4 //0AF4是读取指定目录的ini中一个字符串并把他定义为新的局部变量
    #defineOPCODE_INIFILE_WRITE_STRING0x0AF5 //0AF5是写入float类型到指定目录的ini文件
    //声明回调函数
    OpcodeResult WINAPI Script_InifileGetInt(CScriptThread* thread);
    OpcodeResult WINAPI Script_InifileWriteInt(CScriptThread* thread);
    OpcodeResult WINAPI Script_InifileGetFloat(CScriptThread* thread);
    OpcodeResult WINAPI Script_InifileWriteFloat(CScriptThread* thread);
    OpcodeResult WINAPI Script_InifileReadString(CScriptThread* thread);
    OpcodeResult WINAPI Script_InifileWriteString(CScriptThread* thread);
    //函数声明在opcodes里面,笔者第一眼还以为是一个typedef,结果当发现了这个函数时才意识到是其是声明,由于入口点已经指定,因此无需main()
    BOOL InitOpcodes()
    {
    BOOL result = FALSE; //bool类型的result为0
    //判断CLEO的版本,CLEO_GetVersion()是官方提供的API,返回cleo版本号(DWORD)的一个函数,CLEO_VERSION已经宏定义为0x0401011E
    if (CLEO_GetVersion() < CLEO_VERSION)
    {
    //调用win api中的MessageBox函数显示错误信息
    MessageBox(HWND_DESKTOP, "An incorrect version of CLEO was loaded.", "IniFiles.cleo", MB_ICONERROR);
    return FALSE; //返回假
    }


    IP属地:中国香港2楼2013-08-19 15:51
    回复
      //opcodes注册,CLEO SDK帮助文件也对其进行了一番描述,无奈是俄文..下面是register opcodes,如果成功则返回值为TRUE,失败就是FALSE,并且会弹出错误提醒
      if (CLEO_RegisterOpcode(OPCODE_INIFILE_GET_INT, &Script_InifileGetInt)) //宏定义替换对应的参数,下同
      result = TRUE;
      if (CLEO_RegisterOpcode(OPCODE_INIFILE_WRITE_INT, &Script_InifileWriteInt)) result = TRUE;
      if (CLEO_RegisterOpcode(OPCODE_INIFILE_GET_FLOAT, &Script_InifileGetFloat)) result = TRUE;
      if (CLEO_RegisterOpcode(OPCODE_INIFILE_WRITE_FLOAT, &Script_InifileWriteFloat)) result = TRUE;
      if (CLEO_RegisterOpcode(OPCODE_INIFILE_READ_STRING, &Script_InifileReadString)) result = TRUE;
      if (CLEO_RegisterOpcode(OPCODE_INIFILE_WRITE_STRING, &Script_InifileWriteString)) result = TRUE;
      return result; //返回result
      }
      //用于完善完整的下层函数路径char类型的指针MakeFullPath,后面也是两个char指针参数 char* MakeFullPath(char *path, char *dst)
      {
      if (path[1] != ':') //如果path[1]的字符非“:” 没有指定某硬盘(注意path[1]表示第二个数组元素,因为数组是从0开始的,也就是paht[0] path[1])
      {
      //取完整正确的路径
      GetCurrentDirectory(MAX_PATH, dst); //取系统当前进程路径
      strcat(dst, "\\"); //添加“\\”到字符串dst结尾
      strcat(dst, path); //同上
      }
      else
      {
      strcpy(dst, path); //复制字符串(paht)的内容到(dst)
      }
      return dst; //返回dst
      }
      OpcodeResult WINAPI Script_InifileGetInt(CScriptThread* thread)
      /* 0AF0=4,%4d% = get_int_from_ini_file %1s% section %2s% key %3s%对应
      0AF0: 0@ = get_int_from_ini_file "cleo\config.ini" section "SectionName" key "intKey"*/
      {
      //定义上方opcodes中需要用到的参数(注意类型)
      char iniPath[MAX_PATH]; //允许的最长路径
      char path[100];
      char sectionName[100];
      char key[100];
      int result;
      CLEO_ReadStringOpcodeParam(thread, path, sizeof(path));
      CLEO_ReadStringOpcodeParam(thread, sectionName, sizeof(sectionName));
      CLEO_ReadStringOpcodeParam(thread, key, sizeof(key));
      //指针函数声明
      MakeFullPath(path, iniPath);
      //如果路径短,GetPrivateProfileInt() 将搜索windows目录
      result = GetPrivateProfileInt(sectionName, key, 0x80000000, iniPath);
      //重点!API调用 result不等于0x80000000,即失败的返回值为为它
      CLEO_SetIntOpcodeParam(thread, result);
      CLEO_SetThreadCondResult(thread, result != 0x80000000);
      return OR_CONTINUE; //OR_CONTINUE;执行成功,OR_INTERRUPT执行失败
      }...
      ///后面写出每个回调函数,就如同上面一样,定义每个参数(注意类型),取目录,调用API 然后判断是否正常,失败提供一个返回值
      全文完


      IP属地:中国香港3楼2013-08-19 15:51
      回复
        复制粘贴辛苦了


        来自iPhone客户端4楼2013-08-20 00:21
        回复