利用资源头文件和动态语言库,提取动态语言库串表中的各项数据显示在Excel中

本文介绍了一款用于提取DLL中语言资源的小工具,通过读取头文件中的ID和Value,结合动态链接库(DLL)中的字符串资源,自动将其写入Excel表格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于在工作中经常要用到多国语言的语言库资源的修改和更新,于是做了一个小的DLL资源提取工具,快速提取出当前封装在动态语言库中的串表资源。生成的Excel有三列,分别对应的是DLL中串表资源中的ID,Value,Caption

 

现在把主要的代码写在下面,由于本人刚刚参加工作,水平有限,所以要是有什么写的不好的地方,还请多多指教。

 

  1. /************************************************* 
  2. Description: // 从整体上实现了DLL字符串资源的析取输出
  3. *************************************************/
  4. void CDLLToolDlg::OnOK() 
  5. {
  6.     hExe = LoadLibrary(m_csLoadPath);    //导入选择的动态链接库
  7.     if (hExe == NULL) 
  8.     {
  9.         return;
  10.     } 
  11.     CreatExcel();           //创建一张Excel表格,用于资源的存储
  12.     ReadHeadFile();         //读取头文件中的ID号和对应的Value值,依Value在DLL中查找出对应的字符串,所有数据写入到Excel表格中
  13.     FreeLibrary(hExe);      //释放DLL资源
  14.     
  15.     CDialog::OnOK();
  16. }

 

  1. /************************************************* 
  2. Function: // CreatExcel 
  3. Description: // 创建一张Excel表格,表的名称是:Resource,表项分别为:TheID, NumValues, TableString
  4. *************************************************/
  5. void CDLLToolDlg::CreatExcel()
  6. {
  7.     CString csDriver;
  8.     CString csExcelFile;
  9.     csDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"// Excel安装驱动
  10.     csExcelFile = m_csOutPath;                // 要建立的Excel文件  "c://ClientResCHS.xls"   m_csOutPath
  11.     // 创建进行存取的字符串
  12.     csSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s", csDriver, csExcelFile, csExcelFile);
  13.     // 创建数据库 (既Excel表格文件)
  14.     if( cDatabase.OpenEx(csSql, CDatabase::noOdbcDialog) )
  15.     {
  16.         // 创建表结构(TheID, NumValues, TableString)
  17.         csSql = "CREATE TABLE Resource (TheID TEXT, NumValues NUMBER, TableString TEXT)"
  18.         cDatabase.ExecuteSQL(csSql);
  19.     }
  20. }

 

 

  1. /************************************************* 
  2. Function: // ReadHeadFile 
  3. Description: // 读取头文件中的ID和Value的函数,此方法可以借鉴到其他读取文本文件的操作中 
  4. *************************************************/
  5. void CDLLToolDlg::ReadHeadFile()
  6. {
  7.     int iPos;
  8.     int iPosError;
  9.     int iValue; 
  10.     int iResult;
  11.     int iNumLength;
  12.     CString csID;
  13.     CString csValue;
  14.     CString csStr2="";
  15.     CString csSubStr;
  16.     CString csSubstring;
  17.     CString csSubstringError;
  18.     CStdioFile cRead;
  19.     char szBuffernew[1000];
  20.     ZeroMemory(szBuffernew,1000);
  21.     if(!cRead.Open(m_csAddHFile, CFile::modeRead))    //打开已经选定的头文件
  22.     {  
  23.         AfxMessageBox("Open  file  error!");  
  24.         return;  
  25.     }  
  26.     
  27.     while(cRead.ReadString(csStr2))               //CStdioFile是逐行读取数据的,并存入str2中 
  28.     {  
  29.         csSubstring ="#define " ;                   
  30.         iPos = csStr2.Find(csSubstring);            //查找含有字符子串"#define "的字符串(这里每一行存为一个字符串)
  31.         csSubstringError = "_APS_NEXT";
  32.         iPosError = csStr2.Find(csSubstringError);  //查找含有字符子串"_APS_NEXT"的字符串
  33.         if(iPos >= 0 && iPosError < 0)       //当含有满足限制要求的字符子串时,进行读写操作                     
  34.         {
  35.             AfxExtractSubString(csSubStr, csStr2, 1, ' '); // 用空格符来分割字符串,并取出第2个子串,既是ID号
  36.             //得到ID号最后一个字符开始,后面剩下的字符串长度,包括一串空格符和Value(以数字形式)
  37.             iNumLength = csStr2.GetLength() - csSubStr.GetLength() - csSubstring.GetLength(); 
  38.             //输出ID号最后一个字符开始,后面剩下的字符串(了解Right,left这两个函数的用法)
  39.             csValue = csStr2.Right(iNumLength);   
  40.             csValue.TrimLeft();        //去掉字符串左边的空白
  41.             iValue = atoi(csValue);    //把Value由字符串类型转化为数字类型
  42.         
  43.             iResult = LoadString(hExe, iValue, szBuffernew, 1000);   //根据iValue的值,从DLL资源中找出对应的字符串
  44. //          CreatResourceLink(iValue, csSubStr, szBuffernew);
  45.             
  46.             if (iResult != 0) 
  47.             {
  48.                 WriteToExcel(iValue, csSubStr, szBuffernew);   //把所有资源写入Excel表格中
  49.             }           
  50.         }       
  51.     }
  52.     cDatabase.Close();   // 关闭数据库
  53. }

 

  1. /************************************************* 
  2. Function: // WriteToExcel 
  3. Description: // 把从DLL中导出的字符串资源写入Excel表格中
  4. Input: // 输入的三个参数分别对应DLL串表中的ID,Value和Caption;
  5. Output: // 对输出参数的说明 
  6. Return: // 函数返回值的说明 
  7. *************************************************/
  8. void WriteToExcel(int iValue, CString csID, CString csCaption)
  9. {  
  10.     int iPos;
  11.     int iReplace;
  12.     CString   csSubstring ="'" ;          
  13.     iPos = csCaption.Find(csSubstring);           //判断当前csCaption字符串中是否含有单引号
  14.                                                //注:在使用SQL语句的时候字符串中的单引号会和语法使用的引号产生匹配冲突
  15.     if(iPos >= 0)                          
  16.     {
  17.         iReplace = csCaption.Replace("/'""/''");    //把单引号由“操作符”替换为“普通字符”
  18.     }
  19.                                                //各项数据插入Excel表格中
  20.     csSql.Format(_T("INSERT INTO Resource (TheID, NumValues, TableString) VALUES ('%s','%u','%s')"), csID, iValue, csCaption);    
  21.     cDatabase.ExecuteSQL(csSql);    
  22. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值