静态loaddll的函数改成动态加载,小工具把大量的导出函数处理下

void File2VecStr( LPCTSTRlpFile, OUTvector<CString> &vecStr )

{

       CMyBytesArraybaTmp;

       file2bin(lpFile, baTmp);

       baTmp.Append(0);

      

       LPCTSTRlpStr = (LPCTSTR)(baTmp.GetData()+2);//unicode文件,前面两个是BOM

       gf::SplitString( lpStr, _T("\n\r"),vecStr );

}

 

void VecStr2File(LPCTSTRlpFile, const vector<CString> &vecStr )

{

       CMyBytesArraybaOut;

       baOut.Add( 0xff );

       baOut.Add(0xfe );

       for( vector<CString>::const_iteratorit = vecStr.begin(); it != vecStr.end(); ++it )

       {

              baOut.Append( *it );

              baOut.Append( _T("\r\n"));

       }

       bin2file( baOut, lpFile );

}

 

CString ParasToStr( vector<CString> vecPara )

{

       CStringstr;

       if ( vecPara.empty() )

              return_T("");

       str = vecPara[0];

       str.TrimLeft( _T("*"));

       for( inti=1; i< vecPara.size(); ++i )

       {

              str += _T(",");

              vecPara[i].TrimLeft( _T("*"));

              str += vecPara[i];

       }

       return str;

}

 

 

void ProcessFunction( const CString &p_str, vector<CString> &code )

{

       CStringstr = p_str;

       CStringstrType;

       CStringstrRetType;

       CStringstrFunc;

       CStringstrParamFull;

       vector<CString> vecPara;

 

       str.TrimRight( _T("") );

       str.TrimLeft( _T("") );

      

       INTnPos = str.FindOneOf( _T("") );

       if ( nPos>0 )

       {

              strType = str.Left( nPos );

       }

       else

       {

              ASSERT(0);

              return;

       }

       //

       str = str.Right( str.GetLength()- nPos-1 ) ;

 

       nPos = str.FindOneOf( _T("(")  );

       if ( nPos<=0 )

       {

              ASSERT(0);

              return;

       }

       strParamFull = str.Right( str.GetLength()- nPos );

 

       {

              CStringstrTmp = strParamFull;

              strTmp.TrimLeft( _T("("));

              strTmp.TrimRight( _T(")"));

              INTPos1 = strTmp.Find( _T("/*"),0 );

              INTnPos2 = strTmp.Find( _T("*/"),0 );

              if ( Pos1>=0&& nPos2>=0 && nPos2> Pos1 )

              {

                     strTmp.Delete(Pos1, (nPos2-Pos1)+2 );

              }

             

              vector<CString> vecTmp;

              gf::SplitString( strTmp, _T(","),vecTmp );  

 

              for( INTi=0; i< vecTmp.size(); ++i )

              {

                     CStringstrWords = vecTmp[i];

                     strWords.TrimLeft( _T("") );

                     strWords.TrimRight( _T("") );

                     vector<CString> vecWord;

                     gf::SplitString( strWords, _T(""), vecWord );

                     if( vecWord.size()>=2 )

                            vecPara.push_back( vecWord[vecWord.size()-1] );

              }

       }

       //

       str = str.Left( nPos );

       nPos = str.ReverseFind( _T(' '));

       if ( nPos<=0 )

       {

              ASSERT(0);

              return;

       }

       strFunc = str.Right( str.GetLength()- nPos-1 );

       //

       strRetType = str.Left(nPos);

       strRetType.TrimLeft(_T("") );

       strRetType.TrimRight( _T("") );

 

       const BOOLbIsVoid = (strType.CompareNoCase( _T("void"))==0);

 

       CStringstrFuncType = strFunc;

       strFuncType.MakeUpper();

 

       CStringstrParaName;

 

 

       CStringstr1, str2, str3, str4;

       str1.Format( _T("typedef%s (%s *%s)%s;"), strType, strRetType, strFuncType, strParamFull );

       str2.Format( _T("static%s pp=(%s)GetProcAddress(g_hHtmlayout,\"%s\");"), strFuncType, strFuncType, strFunc );

       str3 = _T("assert(pp);");

             

       if ( bIsVoid )

       {

              str4.Format( _T("if(pp&&g_hHtmlayout){pp(%s);} return;"), ParasToStr(vecPara) );

       }

       else

       {

              str4.Format( _T("if(pp&&g_hHtmlayout){returnpp(%s);} return 0;"), ParasToStr(vecPara) );

       }

       code.push_back(p_str);

       code.push_back( _T("{"));

       code.push_back( str1 );

       code.push_back( str2 );

       code.push_back( str3 );

       code.push_back( str4 );

       code.push_back( _T("}"));

       code.push_back( _T(""));

 

/************************************************************************/

/*

typedef LRESULT (CALLBACK *TT)(HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam);

static TT pp = (TT)GetProcAddress( g_hHtmlayout,"bb");

if ( pp )

{

  if ( !isvoid )

       returnpp(para);

  return;

}

assert(0);

 if ( !isvoid )

   retur 0;

 

       */

/************************************************************************/

}

 

void DDDDD()

{

/*

       std::set<CString>setSymbols;

       {

              vector<CString>vecSymbols;

              File2VecStr(_T("c:\\aa.txt"), vecSymbols );

              for(vector<CString>::iterator iter = vecSymbols.begin(); iter != vecSymbols.end(); ++iter )

              {

                     CStringstr = *iter;

                     INTnPos = str.ReverseFind( _T(' ') );

                     if( nPos<0 )

                            continue;

                    

                     CStringstrRight = str.Right( str.GetLength()- nPos-1 );

                     if( strRight.IsEmpty() )

                            continue;

                     setSymbols.insert(strRight );

              }

       }

*/

 

       //静态加载的dll改成动态加载,每个函数都需要动态获取。

       vector<CString> vecFunction;

       {

              vector<CString> vecTmp;

              File2VecStr(_T("c:\\htmlayout.h"), vecTmp );

              File2VecStr(_T("c:\\htmlayout_dom.h"), vecTmp );

              File2VecStr(_T("c:\\value.h"), vecTmp );

 

              BOOLbStarted =FALSE;

 

              CStringstrFunction;

              for( vector<CString>::iteratoritervecTmp.begin(); iter != vecTmp.end(); ++iter )

              {

                     CStringstrTmp = *iter;

                     strTmp.TrimLeft( _T("") );

                     strTmp.TrimRight( _T("") );

 

                     if ( strTmp.IsEmpty() )

                            continue;

 

                     if( bStarted )

                     {

                            constBOOLbEnd = (strTmp.GetAt( strTmp.GetLength()-1) == _T(';'));

                            if( bEnd )

                            {

                                   strTmp.TrimRight( _T(";"));                               

                                   strFunction += strTmp;

                                   vecFunction.push_back( strFunction );

                                   bStarted = FALSE;

                                   strFunction = _T("");

                            }

                            else

                                   strFunction += strTmp;

                     }

                     else

                     {

                            bStarted = (strTmp.Left(8).CompareNoCase( _T("EXTERN_C"))==0 ) ;

                            if( bStarted )

                            {

                                   constBOOLbEnd = (strTmp.GetAt( strTmp.GetLength()-1) == _T(';'));

                                   if( bEnd )

                                   {

                                          strTmp.TrimRight( _T(";"));

                                          vecFunction.push_back( strTmp.Right( strTmp.GetLength()-8) );

                                          bStarted = FALSE;

                                   }

                                   else

                                   {

                                          strFunction = strTmp.Right( strTmp.GetLength()-8);

                                   }

                            }

                     }

              }//end for

       }

 

       {

              vector<CString> code;

              for( vector<CString>::iteratorit = vecFunction.begin(); it != vecFunction.end(); ++it  )

              {

                     ProcessFunction(*it, code );

              }

              VecStr2File(_T("c:\\code.h"), code );

       }

 

       VecStr2File( _T("c:\\ddd.h"),vecFunction );

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值