Changeset 697 in dev for trunk/ab5.0/abdev/abdev/abdev.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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];
Note: See TracChangeset for help on using the changeset viewer.