Changeset 697 in dev


Ignore:
Timestamp:
Jul 19, 2008, 9:03:01 PM (13 years ago)
Author:
イグトランス (egtra)
Message:

エディタの2重オープンチェックの厳密化。abdevからコンパイラへのHWNDの受け渡しを64ビット対応へ。

Location:
trunk/ab5.0/abdev
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Program.cpp

    r634 r697  
    6666            // 親エディタのウィンドウ ハンドル
    6767            isKickedFromEditor = true;
    68             sscanf( cmdLine.GetParameter().c_str(), "%08x", &hOwnerEditor );
     68            sscanf( cmdLine.GetParameter().c_str(), "%p", &hOwnerEditor );
    6969        }
    7070        else if( cmdLine.GetCommand() == "show_dlg" )
  • trunk/ab5.0/abdev/abdev/Common.h

    r681 r697  
    345345};
    346346
     347struct FILEIDENTITY{
     348    DWORD VolumeSerialNumber;
     349    DWORD FileIndexHigh;
     350    DWORD FileIndexLow;
     351};
     352
     353inline bool IsFileIdentityValid(FILEIDENTITY const& fi){
     354    return fi.VolumeSerialNumber != 0
     355        && fi.FileIndexHigh != 0
     356        && fi.FileIndexLow != 0;
     357}
     358
     359inline bool operator ==(FILEIDENTITY const& lhs, FILEIDENTITY const& rhs)
     360{
     361    return lhs.VolumeSerialNumber == rhs.VolumeSerialNumber
     362        && lhs.FileIndexHigh == rhs.FileIndexHigh
     363        && lhs.FileIndexLow == rhs.FileIndexLow;
     364}
     365
    347366struct MDIINFO{
    348367    HWND hwnd;
     
    350369    std::string title;
    351370    std::string path;
     371    FILEIDENTITY FileIdentity;
    352372
    353373    union{
     
    577597void ResetState_DocMenu(void);
    578598void DuplicateTitleCheck(char *lpszTitle);
    579 HWND NewTextEditWindow(char *filepath,_int8 DocumentType,COLORREF TabColor=TABCOLOR_GRAY);
     599HWND NewTextEditWindow(char const *filepath,_int8 DocumentType,COLORREF TabColor=TABCOLOR_GRAY);
    580600void CloseDocWindow(int WndNum);
    581601void ResizeTextEditWnd(HWND hwnd,int cx,int cy);
  • trunk/ab5.0/abdev/abdev/FileOperation.cpp

    r651 r697  
    298298
    299299    // TODO:
    300     char *OpenFileName = const_cast<char *>(filePath.c_str());
     300    char const *OpenFileName = filePath.c_str();
    301301
    302302    i=GetFileExtension(OpenFileName);
  • trunk/ab5.0/abdev/abdev/abdev.cpp

    r655 r697  
    33#include "abdev.h"
    44
     5#ifdef _DEBUG
     6#include <crtdbg.h>
     7#endif
    58
    69#if defined HeapAlloc
     
    731734    }
    732735}
    733 HWND NewTextEditWindow(char *filepath,_int8 DocumentType,COLORREF TabColor)
     736
     737//たぶんこれでは全然足りない
     738inline void PathNormalize(char *buf, size_t bufSize, const char *path)
     739{
     740    DWORD shortFilepathLen = GetShortPathName(path, buf, bufSize);
     741    std::replace(buf, buf + shortFilepathLen, '/', '\\');
     742}
     743
     744HWND NewTextEditWindow(const char *filepath,_int8 DocumentType,COLORREF TabColor)
    734745{
    735746    int i;
     
    739750    int iCharCode=NKF_SHIFT_JIS;
    740751    int iLfCode=LFCODE_CRLF;
     752    FILEIDENTITY fileIdentity = {0};
    741753
    742754    if(filepath){
     755        HANDLE hFile=CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
     756        if(hFile==INVALID_HANDLE_VALUE){
     757            sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
     758            ::MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
     759            return 0;
     760        }
     761        DWORD length;
     762
     763        typedef BOOL WINAPI GFIBH(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
     764        BY_HANDLE_FILE_INFORMATION fi;
     765        GFIBH *const pgfibh = reinterpret_cast<GFIBH*>(
     766            GetProcAddress(GetModuleHandle("kernel32"), "GetFileInformationByHandle"));
     767        if(pgfibh && pgfibh(hFile, &fi)){
     768            fileIdentity.VolumeSerialNumber = fi.dwVolumeSerialNumber;
     769            fileIdentity.FileIndexHigh = fi.nFileIndexHigh;
     770            fileIdentity.FileIndexLow = fi.nFileIndexLow;
     771            length=fi.nFileSizeLow;
     772        }
     773        else{
     774            length=GetFileSize(hFile,NULL);
     775        }
    743776
    744777        //すでに指定されたファイルが開かれている場合
    745778        hChild=::GetWindow(hClient,GW_CHILD);
     779        char shortFilepath[MAX_PATH];
     780        PathNormalize(shortFilepath, MAX_PATH, filepath);
    746781        while(hChild){
    747782            i=GetWndNum(hChild);
    748783            if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
    749                 if(lstrcmpi(MdiInfo[i]->path.c_str(),filepath)==0) break;
     784                if(IsFileIdentityValid(fileIdentity)&&IsFileIdentityValid(MdiInfo[i]->FileIdentity)
     785                    && fileIdentity==MdiInfo[i]->FileIdentity)
     786                {
     787                    break;
     788                }
     789                else{
     790                    char shortPathnameDoc[MAX_PATH];
     791                    PathNormalize(shortPathnameDoc, MAX_PATH, MdiInfo[i]->path.c_str());
     792                    if(_strcmpi(shortFilepath,shortPathnameDoc)==0)
     793                        break;
     794                }
    750795            }
    751796            hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
     
    761806        //ファイル読み込み(正常に読み込めるかの確認も含む)
    762807        //////////////////////////////////////////////////////
    763 
    764         HANDLE hFile;
    765         hFile=CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    766         if(hFile==INVALID_HANDLE_VALUE){
    767             sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
    768             ::MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
    769             return 0;
    770         }
    771         int length;
    772         length=GetFileSize(hFile,NULL);
    773808
    774809        char *temp;
     
    882917
    883918    mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
    884     hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(long)&mdic);   //ウィンドウ作成
     919    hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,reinterpret_cast<LPARAM>(&mdic));   //ウィンドウ作成
    885920
    886921    //TextEditorコントロールを設置
     
    893928
    894929    //ウィンドウのID登録
    895     MdiInfo.push_back( new MDIINFO() );
     930    MDIINFO *pmi = new MDIINFO();
     931    MdiInfo.push_back( pmi );
    896932    i = MdiInfo.size()-1;
    897     MdiInfo[i]->hwnd=hChild;
    898     MdiInfo[i]->DocType=DocumentType;
     933    pmi->hwnd=hChild;
     934    pmi->DocType=DocumentType;
    899935    DuplicateTitleCheck(str);
    900     MdiInfo[i]->title = str;
     936    pmi->title = str;
     937    pmi->FileIdentity = fileIdentity;
    901938    if(filepath)
    902939    {
    903         MdiInfo[i]->path = filepath;
     940        pmi->path = filepath;
    904941    }
    905942    else
    906943    {
    907         MdiInfo[i]->path = "";
    908     }
    909 
    910     MdiInfo[i]->pMdiTextEdit = new CMdiTextEdit( MdiInfo[i] );
    911 
    912     MdiInfo[i]->pMdiTextEdit->hEdit=hEdit;
    913     MdiInfo[i]->pMdiTextEdit->pobj_WebResult=new CWebResult(hChild);
    914     MdiInfo[i]->pMdiTextEdit->pobj_Ruler=new CRuler(hChild,MdiInfo[i]);
    915     MdiInfo[i]->pMdiTextEdit->hIcon=shfi.hIcon;
    916     MdiInfo[i]->pMdiTextEdit->buffer=buffer;
    917     MdiInfo[i]->pMdiTextEdit->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
    918     MdiInfo[i]->pMdiTextEdit->iUnderStart=-1;
    919     MdiInfo[i]->pMdiTextEdit->iUnderEnd=-1;
    920     MdiInfo[i]->pMdiTextEdit->StartCaretPos.x=0;
    921     MdiInfo[i]->pMdiTextEdit->StartCaretPos.y=0;
    922     MdiInfo[i]->pMdiTextEdit->EndCaretPos.x=0;
    923     MdiInfo[i]->pMdiTextEdit->EndCaretPos.y=0;
    924     MdiInfo[i]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
    925     MdiInfo[i]->pMdiTextEdit->bAutoScroll=0;
    926     MdiInfo[i]->pMdiTextEdit->iWidth_ControlTabSpace=
    927         GetControlTabSpace(i,&MdiInfo[i]->pMdiTextEdit->iLineNumberTextCount);
    928     MdiInfo[i]->pMdiTextEdit->iCharCode=iCharCode;
    929     MdiInfo[i]->pMdiTextEdit->iLfCode=iLfCode;
    930     MdiInfo[i]->IndentStr=0;
     944        pmi->path = "";
     945    }
     946
     947    pmi->pMdiTextEdit = new CMdiTextEdit( MdiInfo[i] );
     948
     949    pmi->pMdiTextEdit->hEdit=hEdit;
     950    pmi->pMdiTextEdit->pobj_WebResult=new CWebResult(hChild);
     951    pmi->pMdiTextEdit->pobj_Ruler=new CRuler(hChild,pmi);
     952    pmi->pMdiTextEdit->hIcon=shfi.hIcon;
     953    pmi->pMdiTextEdit->buffer=buffer;
     954    pmi->pMdiTextEdit->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
     955    pmi->pMdiTextEdit->iUnderStart=-1;
     956    pmi->pMdiTextEdit->iUnderEnd=-1;
     957    pmi->pMdiTextEdit->StartCaretPos.x=0;
     958    pmi->pMdiTextEdit->StartCaretPos.y=0;
     959    pmi->pMdiTextEdit->EndCaretPos.x=0;
     960    pmi->pMdiTextEdit->EndCaretPos.y=0;
     961    pmi->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
     962    pmi->pMdiTextEdit->bAutoScroll=0;
     963    pmi->pMdiTextEdit->iWidth_ControlTabSpace=
     964        GetControlTabSpace(i,&pmi->pMdiTextEdit->iLineNumberTextCount);
     965    pmi->pMdiTextEdit->iCharCode=iCharCode;
     966    pmi->pMdiTextEdit->iLfCode=iLfCode;
     967    pmi->IndentStr=0;
    931968
    932969
     
    14531490    return RegisterClassEx(&wcl);
    14541491}
    1455 int PASCAL WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int ShowCmd){
     1492int PASCAL WinMain(HINSTANCE hThisInst,HINSTANCE,LPSTR lpCmdLine,int ShowCmd){
     1493#ifdef _DEBUG
     1494    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
     1495#endif
    14561496    int i,i2,IsStr;
    14571497    char str[MAX_PATH],str2[MAX_PATH],dummy[1024];
  • trunk/ab5.0/abdev/abdev/include/MainFrame.h

    r629 r697  
    3434
    3535    // 生成された
    36     ::LRESULT OnCreate( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled );
     36    ::LRESULT OnCreate( ::CREATESTRUCT const* );
    3737
    3838    // OSが終了する
     
    255255    // メッセージマップ
    256256    BEGIN_MSG_MAP( MainFrame )
    257         MESSAGE_HANDLER( WM_CREATE, OnCreate )
     257        MSG_WM_CREATE( OnCreate )
    258258        MSG_WM_SIZE( OnSize )
    259259        MSG_WM_QUERYENDSESSION( OnQueryEndSession )
  • trunk/ab5.0/abdev/abdev/include/ProjectManager/ProjectManager.h

    r655 r697  
    1414    }
    1515
    16     void Load( char *path );
     16    void Load( char const *path );
    1717    void Save();
    1818    bool Close();
  • trunk/ab5.0/abdev/abdev/src/MainFrame.cpp

    r655 r697  
    171171}
    172172
    173 ::LRESULT MainFrame::OnCreate( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled )
     173::LRESULT MainFrame::OnCreate( ::CREATESTRUCT const* )
    174174{
    175175    // ウィンドウエリアマネージャに親ウィンドウを登録
     
    207207    extern WNDPROC oldMainFrameWndProc;
    208208    oldMainFrameWndProc = (WNDPROC)::GetWindowLong( hOwner, GWL_WNDPROC );
    209     ::SetWindowLong( hOwner, GWL_WNDPROC, (LONG)WindowFunc );
     209    ::SetWindowLongPtr( hOwner, GWL_WNDPROC, reinterpret_cast<LONG_PTR>(WindowFunc) );
    210210
    211211    SetupWindow(hOwner);
     
    517517void MainFrame::OnDropFiles( HDROP hDropInfo )
    518518{
    519     int max = DragQueryFile(hDropInfo,-1,0,0);
     519    int max = DragQueryFile(hDropInfo,static_cast<DWORD>(-1),0,0);
    520520    for(int i=0;i<max;i++){
    521521        char temporary[1024];
     
    526526}
    527527
    528 void MainFrame::OnPaint( HDC dummy )
     528void MainFrame::OnPaint( HDC )
    529529{
    530530    PAINTSTRUCT ps;
     
    10961096void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine)
    10971097{
    1098     std::string argsStr = (std::string)"\"" + appPath + "\" " + cmdLine;
     1098    std::string argsStr = "\"" + appPath + "\" " + cmdLine;
    10991099    STARTUPINFO si;
    11001100    PROCESS_INFORMATION pi;
     
    11431143
    11441144        if(IsNeedCompileForProject(1))
    1145             sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%08x",temp2,temp3,m_hWnd);
     1145            sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%p",temp2,temp3,m_hWnd);
    11461146        else
    1147             sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%08x",temp2,temp3,m_hWnd);
     1147            sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%p",temp2,temp3,m_hWnd);
    11481148
    11491149        // DLLオプション
     
    11691169        if(!SetRunning(hChild)) return;
    11701170        if(IsNeedCompile(MdiInfo[GetWndNum(hChild)]->path,1))
    1171             sprintf(temporary,"\"%s\" /debug /run /wnd:%08x",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
     1171            sprintf(temporary,"\"%s\" /debug /run /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
    11721172        else
    1173             sprintf(temporary,"\"%s\" /run /wnd:%08x",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
     1173            sprintf(temporary,"\"%s\" /run /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
    11741174
    11751175        //ブレークポイントをセーブ
     
    12201220        lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
    12211221
    1222         sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%08x",temp2,temp3,m_hWnd);
     1222        sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%p",temp2,temp3,m_hWnd);
    12231223
    12241224        //DLLオプション
     
    12401240        //単独ソースコード
    12411241        if(!SetRunning(hChild)) return;
    1242         sprintf(temporary,"\"%s\" /debug /wnd:%08x",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
     1242        sprintf(temporary,"\"%s\" /debug /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
    12431243    }
    12441244
     
    12821282    if(idProcess==0) return;
    12831283
    1284     sprintf(temporary,"/attach:%08x /wnd:%08x",idProcess,m_hWnd);
     1284    sprintf(temporary,"/attach:%08x /wnd:%p",idProcess,m_hWnd);
    12851285
    12861286    //コンパイルビューをクリップするかどうか
     
    13401340        lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
    13411341
    1342         sprintf(temporary,"\"%s\" \"%s\" /wnd:%08x",temp2,temp3,m_hWnd);
     1342        sprintf(temporary,"\"%s\" \"%s\" /wnd:%p",temp2,temp3,m_hWnd);
    13431343
    13441344        //DLLオプション
     
    13601360        //単独ソースコード
    13611361        if(!SetRunning(hChild)) return;
    1362         sprintf(temporary,"\"%s\" /wnd:%08x",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
     1362        sprintf(temporary,"\"%s\" /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
    13631363    }
    13641364
     
    17071707        {
    17081708            HWND hChild=::GetWindow(hClient,GW_CHILD);
    1709             int WndNum=GetWndNum(hChild);
    17101709
    17111710            TC_ITEM tcItem;
  • trunk/ab5.0/abdev/abdev/src/ProjectManager/ProjectManager.cpp

    r655 r697  
    55void OpenWorkfile( const std::string &path );
    66
    7 void Project::Load( char *path )
     7void Project::Load( char const *path )
    88{
    99    extern HANDLE hHeap;
Note: See TracChangeset for help on using the changeset viewer.