Changeset 209 in dev for trunk/abdev/BasicCompiler32/MakePeHdr.cpp
- Timestamp:
- Jul 13, 2007, 4:22:02 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/MakePeHdr.cpp
r208 r209 181 181 182 182 //クラス名を取得(詳細情報はGetAllClassInfoで取得) 183 // Collect UserProcs関数の中で参照されるオブジェクト名を事前に取得する。183 // CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。 184 184 // ※オブジェクトの内容までは取得しない 185 185 compiler.GetMeta().GetClasses().CollectClassesForNameOnly( Smoothie::Lexical::source ); … … 192 192 193 193 // サブルーチン(ユーザー定義、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の後に呼び出す) 198 202 compiler.GetMeta().GetClasses().GetAllClassInfo(); 199 203 200 204 // サブルーチン(ユーザー定義、DLL関数)のイテレータの準備 201 205 compiler.GetMeta().GetUserProcs().Iterator_Init(); 206 compiler.GetMeta().GetDllProcs().Iterator_Init(); 207 202 208 /* 203 209 if( !compiler.GetMeta().Write( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) ) … … 533 539 // 使用するDLL関数のチェック 534 540 //////////////////////////////// 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()); 542 565 } 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()); 559 572 } 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); 570 574 } 571 575 } … … 679 683 //インポートDLL情報 680 684 ///////////////////// 681 extern DllProc **ppDeclareHash;682 char **ppDllNames;683 int ImportDllNum;684 685 685 686 /* … … 697 698 */ 698 699 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] ){ 712 720 break; 713 721 } 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++; 727 728 } 728 729 } … … 740 741 pImportTable[i].ForwarderChain=0; 741 742 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() ){ 755 750 pDllProc=pDllProc->pNextData; 751 continue; 752 } 753 754 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 755 //ルックアップデータのサイズを追加 756 LookupSize+=sizeof(DWORD); 756 757 } 757 758 } … … 770 771 i3+=ImportDllNum*0x10; 771 772 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); 778 801 } 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;802 802 } 803 803 } … … 1069 1069 HintSize; //ヒント名(関数名)テーブル 1070 1070 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() ){ 1084 1077 pDllProc=pDllProc->pNextData; 1078 continue; 1079 } 1080 1081 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 1082 //ルックアップ テーブル 1083 pLookupTable[i5++]+=MemPos_ImportSection; 1085 1084 } 1086 1085 }
Note:
See TracChangeset
for help on using the changeset viewer.