|
@@ -13,6 +13,11 @@
|
|
|
#endif // RVC_OS_WIN
|
|
|
|
|
|
|
|
|
+#ifndef RVC_MAX_INI_LEN
|
|
|
+#define RVC_MAX_INI_LEN 1024*16
|
|
|
+#endif // !RVC_MAX_INI_LEN
|
|
|
+
|
|
|
+
|
|
|
bool Unzip2Folder(BSTR lpZipFile, BSTR lpFolder)
|
|
|
{
|
|
|
#ifdef RVC_OS_WIN
|
|
@@ -373,4 +378,381 @@ bool getUniqueDir(string path, string &dirName)
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+UINT GetPrivateProfileIntEx(LPCSTR lpAppName,LPCSTR lpKeyName,INT nDefault,LPCSTR lpFileName)
|
|
|
+{
|
|
|
+ char lpReturnedString[MAX_PATH] = { 0 };
|
|
|
+ DWORD nRet = GetPrivateProfileStringEx(
|
|
|
+ lpAppName,
|
|
|
+ lpKeyName,
|
|
|
+ "",
|
|
|
+ lpReturnedString,
|
|
|
+ sizeof(lpReturnedString),
|
|
|
+ lpFileName
|
|
|
+ );
|
|
|
+
|
|
|
+ if (nRet == 0) {
|
|
|
+ return nDefault;
|
|
|
+ }
|
|
|
+
|
|
|
+ return atoi(lpReturnedString);
|
|
|
+}
|
|
|
+
|
|
|
+BOOL WritePrivateProfileStringEx(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR lpString,LPCSTR lpFileName)
|
|
|
+{
|
|
|
+ FILE* fp = NULL;
|
|
|
+ static char szLine[RVC_MAX_INI_LEN] = { 0 };
|
|
|
+ static char tmpstr[RVC_MAX_INI_LEN] = { 0 };
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ memset(tmpstr, 0, sizeof(tmpstr));
|
|
|
+ int rtnval;
|
|
|
+ int i = 0;
|
|
|
+ int secFlag = 0;
|
|
|
+
|
|
|
+ if ((fp = fopen(lpFileName, "rw+")) == NULL){
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ int lineLen = 0;//整行长度
|
|
|
+ int orgEqualPos = 0;//=号在原行中的位置
|
|
|
+ int equalPos = 0; //=号在去空格后的位置
|
|
|
+ strcpy(tmpstr, "[");
|
|
|
+ strcat(tmpstr, lpAppName);
|
|
|
+ strcat(tmpstr, "]");
|
|
|
+ int endFlag;
|
|
|
+ while (!feof(fp))
|
|
|
+ {
|
|
|
+
|
|
|
+ rtnval = fgetc(fp);
|
|
|
+ if (rtnval == EOF){
|
|
|
+ //最后一行可能无换行符号
|
|
|
+ rtnval = '\n';
|
|
|
+ endFlag = 1;
|
|
|
+ }
|
|
|
+ //注释行
|
|
|
+ if ('#' == rtnval || ';' == rtnval)
|
|
|
+ {
|
|
|
+ fgets(szLine, sizeof(szLine), fp);
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ lineLen = 0;
|
|
|
+ orgEqualPos = 0;
|
|
|
+ equalPos = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if ('/' == rtnval)
|
|
|
+ {
|
|
|
+ szLine[i++] = rtnval;
|
|
|
+ lineLen++;
|
|
|
+ if ('/' == (rtnval = fgetc(fp))) //注释行
|
|
|
+ {
|
|
|
+ fgets(szLine, sizeof(szLine), fp);
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ lineLen = 0;
|
|
|
+ orgEqualPos = 0;
|
|
|
+ equalPos = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtnval != ' ' && rtnval != '\t')
|
|
|
+ {
|
|
|
+ szLine[i++] = rtnval; //去掉空格和tab后的字符串
|
|
|
+ if (rtnval == '=')
|
|
|
+ {
|
|
|
+ orgEqualPos = lineLen;
|
|
|
+ equalPos = i - 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ lineLen++; //字符
|
|
|
+
|
|
|
+ if (rtnval == '\n'){
|
|
|
+ szLine[--i] = '\0';
|
|
|
+ if (szLine[--i] == '\r')
|
|
|
+ szLine[i--] = '\0';
|
|
|
+
|
|
|
+ if ((equalPos != 0) && (secFlag == 1))
|
|
|
+ {
|
|
|
+ szLine[equalPos] = '\0';
|
|
|
+ if (strcasecmp(szLine, lpKeyName) == 0)
|
|
|
+ {
|
|
|
+ //找到key对应变量
|
|
|
+ int leftPos = ftell(fp);
|
|
|
+ int writePos = leftPos - lineLen + orgEqualPos + 1;
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ int leftLen = ftell(fp) - leftPos;
|
|
|
+ char* pLeft = new char[leftLen];
|
|
|
+ fseek(fp, leftPos, SEEK_SET);
|
|
|
+ fread(pLeft, leftLen, 1, fp);
|
|
|
+ fseek(fp, writePos, SEEK_SET);
|
|
|
+ fwrite(lpString, strlen(lpString), 1, fp);
|
|
|
+ fwrite("\n", sizeof(char), 1, fp);
|
|
|
+ fwrite(pLeft, leftLen, 1, fp);
|
|
|
+ delete[]pLeft;
|
|
|
+ pLeft = 0;
|
|
|
+ fclose(fp);
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (strcasecmp(tmpstr, szLine) == 0)
|
|
|
+ {
|
|
|
+ //找到section
|
|
|
+ secFlag = 1;
|
|
|
+ }
|
|
|
+ else if (secFlag == 1 && szLine[0] == '[' && szLine[i] == ']')
|
|
|
+ {//进入下个section了,说明没找到
|
|
|
+ int leftPos = ftell(fp) - lineLen;
|
|
|
+ int writePos = leftPos;
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ int leftLen = ftell(fp) - leftPos;
|
|
|
+ char* pLeft = new char[leftLen];
|
|
|
+ fseek(fp, leftPos, SEEK_SET);
|
|
|
+ fread(pLeft, leftLen, 1, fp);
|
|
|
+ fseek(fp, writePos, SEEK_SET);
|
|
|
+ fwrite("\n", sizeof(char), 1, fp);
|
|
|
+ fwrite(lpKeyName, strlen(lpKeyName), 1, fp);
|
|
|
+ fwrite("=", sizeof(char), 1, fp);
|
|
|
+ fwrite(lpString, strlen(lpString), 1, fp);
|
|
|
+ fwrite("\n", sizeof(char), 1, fp);
|
|
|
+ fwrite(pLeft, leftLen, 1, fp);
|
|
|
+ delete[]pLeft;
|
|
|
+ pLeft = 0;
|
|
|
+ fclose(fp);
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //reset
|
|
|
+ if (endFlag == 1)
|
|
|
+ break;
|
|
|
+ i = 0;
|
|
|
+ lineLen = 0;
|
|
|
+ orgEqualPos = 0;
|
|
|
+ equalPos = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //到文件尾了
|
|
|
+ if (secFlag)
|
|
|
+ {//必须有section
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ fwrite("\n", sizeof(char), 1, fp);
|
|
|
+ fwrite(lpKeyName, strlen(lpKeyName), 1, fp);
|
|
|
+ fwrite("=", sizeof(char), 1, fp);
|
|
|
+ fwrite(lpString, strlen(lpString), 1, fp);
|
|
|
+ fwrite("\n", sizeof(char), 1, fp);
|
|
|
+ }
|
|
|
+ fclose(fp);
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+DWORD GetPrivateProfileStringEx(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName)
|
|
|
+{
|
|
|
+ FILE* fp = NULL;
|
|
|
+ static char szLine[RVC_MAX_INI_LEN] = { 0 };
|
|
|
+ static char tmpstr[RVC_MAX_INI_LEN] = { 0 };
|
|
|
+ int rtnval;
|
|
|
+ int i = 0;
|
|
|
+ int secFlag = 0;
|
|
|
+
|
|
|
+ if ((fp = fopen(lpFileName, "r")) == NULL){
|
|
|
+ Dbg("have no such file[%s]", lpFileName);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ int equalPos = 0; //=号在去空格后的位置
|
|
|
+ strcpy(tmpstr, "[");
|
|
|
+ strcat(tmpstr, lpAppName);
|
|
|
+ strcat(tmpstr, "]");
|
|
|
+ int endFlag = 0;
|
|
|
+ while (!feof(fp))
|
|
|
+ {
|
|
|
+ rtnval = fgetc(fp);
|
|
|
+ if (rtnval == EOF){
|
|
|
+ //最后一行可能无换行符号
|
|
|
+ rtnval = '\n';
|
|
|
+ endFlag = 1;
|
|
|
+ }
|
|
|
+ //注释行
|
|
|
+ if ('#' == rtnval || ';' == rtnval)
|
|
|
+ {
|
|
|
+ fgets(szLine, sizeof(szLine), fp);
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ equalPos = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if ('/' == rtnval)
|
|
|
+ {
|
|
|
+ szLine[i++] = rtnval;
|
|
|
+ if ('/' == (rtnval = fgetc(fp))) //注释行
|
|
|
+ {
|
|
|
+ fgets(szLine, sizeof(szLine), fp);
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ equalPos = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtnval != ' ' && rtnval != '\t')
|
|
|
+ {
|
|
|
+ szLine[i++] = rtnval; //去掉空格和tab后的字符串
|
|
|
+ if (rtnval == '=')
|
|
|
+ {
|
|
|
+ equalPos = i - 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtnval == '\n'){
|
|
|
+ szLine[--i] = '\0';
|
|
|
+
|
|
|
+ if (szLine[--i] == '\r')
|
|
|
+ szLine[i--] = '\0';
|
|
|
+
|
|
|
+ if ((equalPos != 0) && (secFlag == 1))
|
|
|
+ {
|
|
|
+ szLine[equalPos] = '\0'; //=号变0
|
|
|
+ if (strcasecmp(szLine, lpKeyName) == 0)
|
|
|
+ {
|
|
|
+ //找到key对应变量
|
|
|
+ strncpy(lpReturnedString, szLine + equalPos + 1, nSize - 1);
|
|
|
+ lpReturnedString[nSize - 1] = '\0';
|
|
|
+ fclose(fp);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (strcasecmp(tmpstr, szLine) == 0)
|
|
|
+ {
|
|
|
+ //找到section
|
|
|
+ secFlag = 1;
|
|
|
+ }
|
|
|
+ else if (secFlag == 1 && szLine[0] == '[' && szLine[i] == ']')
|
|
|
+ {//进入下个section了,说明没找到
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (endFlag == 1)
|
|
|
+ break;
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ equalPos = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fp);
|
|
|
+ //没找到则用默认
|
|
|
+ strncpy(lpReturnedString, lpDefault, nSize - 1);
|
|
|
+ lpReturnedString[nSize - 1] = '\0';
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+DWORD GetPrivateProfileSectionEx(LPCSTR lpAppName, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName)
|
|
|
+{
|
|
|
+ //由于项目中未使用,暂未实现
|
|
|
+ assert(0);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+DWORD GetPrivateProfileSectionNamesEx(LPSTR lpszReturnBuffer, DWORD nSize, LPCSTR lpFileName)
|
|
|
+{
|
|
|
+ FILE* fp = NULL;
|
|
|
+ static char szLine[RVC_MAX_INI_LEN] = { 0 };
|
|
|
+ static char tmpstr[RVC_MAX_INI_LEN] = { 0 };
|
|
|
+ int rPos = 0;
|
|
|
+
|
|
|
+ memset(lpszReturnBuffer, 0, nSize);
|
|
|
+ int rtnval;
|
|
|
+ int i = 0;
|
|
|
+ int endFlag;
|
|
|
+
|
|
|
+ if ((fp = fopen(lpFileName, "r")) == NULL){
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ while (!feof(fp))
|
|
|
+ {
|
|
|
+ rtnval = fgetc(fp);
|
|
|
+ if (rtnval == EOF){
|
|
|
+ //最后一行可能无换行符号
|
|
|
+ rtnval = '\n';
|
|
|
+ endFlag = 1;
|
|
|
+ }
|
|
|
+ //注释行
|
|
|
+ if ('#' == rtnval || ';' == rtnval)
|
|
|
+ {
|
|
|
+ fgets(szLine, sizeof(szLine), fp);
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else if ('/' == rtnval)
|
|
|
+ {
|
|
|
+ szLine[i++] = rtnval;
|
|
|
+ if ('/' == (rtnval = fgetc(fp))) //注释行
|
|
|
+ {
|
|
|
+ fgets(szLine, sizeof(szLine), fp);
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtnval != ' ' && rtnval != '\t')
|
|
|
+ {
|
|
|
+ szLine[i++] = rtnval; //去掉空格和tab后的字符串
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rtnval == '\n')
|
|
|
+ {
|
|
|
+ szLine[--i] = '\0';
|
|
|
+ if (szLine[--i] == '\r')
|
|
|
+ szLine[i--] = '\0';
|
|
|
+
|
|
|
+ if (szLine[0] == '[' && szLine[i] == ']')
|
|
|
+ {
|
|
|
+ //找到section
|
|
|
+ for (int j = 1; j < i && rPos < nSize - 1; j++)
|
|
|
+ lpszReturnBuffer[rPos++] = szLine[j];
|
|
|
+ lpszReturnBuffer[rPos++] = '\0';
|
|
|
+ if (rPos >= nSize)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (endFlag == 1)
|
|
|
+ break;
|
|
|
+
|
|
|
+ //reset
|
|
|
+ i = 0;
|
|
|
+ memset(szLine, 0, sizeof(szLine));
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lpszReturnBuffer[rPos] = '\0';
|
|
|
+ fclose(fp);
|
|
|
+ return 0;
|
|
|
+}
|