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>::iteratoriter = vecTmp.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 );
}