Ignore:
Timestamp:
Jul 13, 2007, 4:22:02 AM (17 years ago)
Author:
dai_9181
Message:

DllProcsクラスを追加。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r208 r209  
    181181
    182182    //クラス名を取得(詳細情報はGetAllClassInfoで取得)
    183     //   CollectUserProcs関数の中で参照されるオブジェクト名を事前に取得する。
     183    //   CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。
    184184    //     ※オブジェクトの内容までは取得しない
    185185    compiler.GetMeta().GetClasses().CollectClassesForNameOnly( Smoothie::Lexical::source );
     
    192192
    193193    // サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得
    194     compiler.pCompilingClass=0;
    195     UserProcs::CollectUserProcs( Smoothie::Lexical::source, compiler.GetMeta().GetUserProcs() );
    196 
    197     // クラス情報を取得(※注 - CollectUserProcsの後に呼び出す)
     194    compiler.pCompilingClass = NULL;
     195    CollectProcedures(
     196        Smoothie::Lexical::source,
     197        compiler.GetMeta().GetUserProcs(),
     198        compiler.GetMeta().GetDllProcs()
     199    );
     200
     201    // クラス情報を取得(※注 - CollectProceduresの後に呼び出す)
    198202    compiler.GetMeta().GetClasses().GetAllClassInfo();
    199203
    200204    // サブルーチン(ユーザー定義、DLL関数)のイテレータの準備
    201205    compiler.GetMeta().GetUserProcs().Iterator_Init();
     206    compiler.GetMeta().GetDllProcs().Iterator_Init();
     207
    202208/*
    203209    if( !compiler.GetMeta().Write( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
     
    533539    // 使用するDLL関数のチェック
    534540    ////////////////////////////////
    535     for(i=0;i<MAX_HASH;i++){
    536         extern DllProc **ppDeclareHash;
    537         const DllProc *pDllProc = ppDeclareHash[i];
    538         while(pDllProc){
    539             if( !pDllProc->IsUsing() ){
    540                 pDllProc=pDllProc->pNextData;
    541                 continue;
     541    compiler.GetMeta().GetDllProcs().Iterator_Reset();
     542    while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() )
     543    {
     544        const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext();
     545
     546        if( !pDllProc->IsUsing() ){
     547            pDllProc=pDllProc->pNextData;
     548            continue;
     549        }
     550
     551        //エラーチェック
     552        HINSTANCE hLib;
     553        hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
     554        if(!hLib){
     555            extern char OutputFileName[MAX_PATH];
     556            char temp2[MAX_PATH],temp3[MAX_PATH];
     557            _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
     558            lstrcat(temp2,temp3);
     559            lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
     560            GetFullPath(temp3,temp2);
     561            hLib=LoadLibrary(temp3);
     562
     563            if(!hLib){
     564                SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos());
    542565            }
    543 
    544             //エラーチェック
    545             HINSTANCE hLib;
    546             hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
    547             if(!hLib){
    548                 extern char OutputFileName[MAX_PATH];
    549                 char temp2[MAX_PATH],temp3[MAX_PATH];
    550                 _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
    551                 lstrcat(temp2,temp3);
    552                 lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
    553                 GetFullPath(temp3,temp2);
    554                 hLib=LoadLibrary(temp3);
    555 
    556                 if(!hLib){
    557                     SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos());
    558                 }
     566        }
     567
     568        if(hLib){
     569            if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
     570                FreeLibrary(hLib);
     571                SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos());
    559572            }
    560 
    561             if(hLib){
    562                 if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
    563                     FreeLibrary(hLib);
    564                     SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos());
    565                 }
    566                 FreeLibrary(hLib);
    567             }
    568 
    569             pDllProc=pDllProc->pNextData;
     573            FreeLibrary(hLib);
    570574        }
    571575    }
     
    679683    //インポートDLL情報
    680684    /////////////////////
    681     extern DllProc **ppDeclareHash;
    682     char **ppDllNames;
    683     int ImportDllNum;
    684685
    685686    /*
     
    697698    */
    698699
    699     ppDllNames=(char **)HeapAlloc(hHeap,0,1);
    700 
    701     ImportDllNum=0;
    702     for(i=0;i<MAX_HASH;i++){
    703         const DllProc *pDllProc=ppDeclareHash[i];
    704         while(pDllProc){
    705             if( !pDllProc->IsUsing() ){
    706                 pDllProc=pDllProc->pNextData;
    707                 continue;
    708             }
    709 
    710             if( pDllProc->GetDllFileName().size() > 16 ){
    711                 SetError(7,NULL,cp);
     700    char **ppDllNames=(char **)HeapAlloc(hHeap,0,1);
     701
     702    int ImportDllNum=0;
     703
     704    compiler.GetMeta().GetDllProcs().Iterator_Reset();
     705    while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() )
     706    {
     707        const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext();
     708
     709        if( !pDllProc->IsUsing() ){
     710            pDllProc=pDllProc->pNextData;
     711            continue;
     712        }
     713
     714        if( pDllProc->GetDllFileName().size() > 16 ){
     715            SetError(7,NULL,cp);
     716            break;
     717        }
     718        for(i2=0;i2<ImportDllNum;i2++){
     719            if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
    712720                break;
    713721            }
    714             for(i2=0;i2<ImportDllNum;i2++){
    715                 if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
    716                     break;
    717                 }
    718             }
    719             if(i2==ImportDllNum){
    720                 ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
    721                 ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
    722                 lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
    723                 ImportDllNum++;
    724             }
    725 
    726             pDllProc=pDllProc->pNextData;
     722        }
     723        if(i2==ImportDllNum){
     724            ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
     725            ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
     726            lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
     727            ImportDllNum++;
    727728        }
    728729    }
     
    740741        pImportTable[i].ForwarderChain=0;
    741742        pImportTable[i].Name=i3+i*0x10;
    742         for(i2=0;i2<MAX_HASH;i2++){
    743             const DllProc *pDllProc=ppDeclareHash[i2];
    744             while(pDllProc){
    745                 if( !pDllProc->IsUsing() ){
    746                     pDllProc=pDllProc->pNextData;
    747                     continue;
    748                 }
    749 
    750                 if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    751                     //ルックアップデータのサイズを追加
    752                     LookupSize+=sizeof(DWORD);
    753                 }
    754 
     743
     744        compiler.GetMeta().GetDllProcs().Iterator_Reset();
     745        while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() )
     746        {
     747            const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext();
     748
     749            if( !pDllProc->IsUsing() ){
    755750                pDllProc=pDllProc->pNextData;
     751                continue;
     752            }
     753
     754            if( pDllProc->GetDllFileName() == ppDllNames[i] ){
     755                //ルックアップデータのサイズを追加
     756                LookupSize+=sizeof(DWORD);
    756757            }
    757758        }
     
    770771    i3+=ImportDllNum*0x10;
    771772    for(i=0,i5=0;i<ImportDllNum;i++){
    772         for(i2=0;i2<MAX_HASH;i2++){
    773             DllProc *pDllProc=ppDeclareHash[i2];
    774             while(pDllProc){
    775                 if( !pDllProc->IsUsing() ){
    776                     pDllProc=pDllProc->pNextData;
    777                     continue;
     773        compiler.GetMeta().GetDllProcs().Iterator_Reset();
     774        while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() )
     775        {
     776            DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext();
     777
     778            if( !pDllProc->IsUsing() ){
     779                pDllProc=pDllProc->pNextData;
     780                continue;
     781            }
     782
     783            if( pDllProc->GetDllFileName() == ppDllNames[i] ){
     784                //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
     785                pDllProc->SetLookupAddress( i3+(i5*sizeof(DWORD)) );
     786
     787                //ルックアップ テーブル
     788                pLookupTable[i5++]=i3+LookupSize+HintSize;
     789
     790                //ヒント テーブル
     791                pHintTable[HintSize++]=0;
     792                pHintTable[HintSize++]=0;
     793                lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
     794                i4=(int)pDllProc->GetAlias().size();
     795                HintSize+=i4+1;
     796                if(i4%2==0) pHintTable[HintSize++]=0;
     797
     798                if(HintAllocSize<HintSize+128){
     799                    HintAllocSize+=128;
     800                    pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize);
    778801                }
    779 
    780                 if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    781                     //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
    782                     pDllProc->SetLookupAddress( i3+(i5*sizeof(DWORD)) );
    783 
    784                     //ルックアップ テーブル
    785                     pLookupTable[i5++]=i3+LookupSize+HintSize;
    786 
    787                     //ヒント テーブル
    788                     pHintTable[HintSize++]=0;
    789                     pHintTable[HintSize++]=0;
    790                     lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
    791                     i4=(int)pDllProc->GetAlias().size();
    792                     HintSize+=i4+1;
    793                     if(i4%2==0) pHintTable[HintSize++]=0;
    794 
    795                     if(HintAllocSize<HintSize+128){
    796                         HintAllocSize+=128;
    797                         pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize);
    798                     }
    799                 }
    800 
    801                 pDllProc=pDllProc->pNextData;
    802802            }
    803803        }
     
    10691069            HintSize;           //ヒント名(関数名)テーブル
    10701070
    1071         for(i2=0;i2<MAX_HASH;i2++){
    1072             const DllProc *pDllProc=ppDeclareHash[i2];
    1073             while(pDllProc){
    1074                 if( !pDllProc->IsUsing() ){
    1075                     pDllProc=pDllProc->pNextData;
    1076                     continue;
    1077                 }
    1078 
    1079                 if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    1080                     //ルックアップ テーブル
    1081                     pLookupTable[i5++]+=MemPos_ImportSection;
    1082                 }
    1083 
     1071        compiler.GetMeta().GetDllProcs().Iterator_Reset();
     1072        while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() )
     1073        {
     1074            const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext();
     1075
     1076            if( !pDllProc->IsUsing() ){
    10841077                pDllProc=pDllProc->pNextData;
     1078                continue;
     1079            }
     1080
     1081            if( pDllProc->GetDllFileName() == ppDllNames[i] ){
     1082                //ルックアップ テーブル
     1083                pLookupTable[i5++]+=MemPos_ImportSection;
    10851084            }
    10861085        }
Note: See TracChangeset for help on using the changeset viewer.