/*! ファイルを確保 @param[in] ptFileName 指定されたファイル名で開く @return LPARAM 0失敗 1〜成功 */ LPARAM DocFileInflate( LPTSTR ptFileName ) { CONST WCHAR rtHead = 0xFEFF; // ユニコードテキストヘッダ WCHAR rtUniBuf; HANDLE hFile; DWORD readed; LPVOID pBuffer; // 文字列バッファ用ポインター INT iByteSize; LPTSTR ptString; LPSTR pcText; UINT_PTR cchSize; LPARAM dNumber; #ifdef BIG_TEXT_SEPARATE // 頁区切りのないTXTかどうかを確認する UINT dSepRslt; LPTSTR ptSepBuff; #endif #ifdef _DEBUG DWORD dTcStart, dTcEnd; #endif //TCHAR atBuff[10]; //ZeroMemory( atBuff, sizeof(atBuff) ); #ifdef _DEBUG dTcStart = GetTickCount( ); #endif assert( ptFileName ); // ファイル開けないのはバグ // ファイル名が空っぽだったら自動的にアウツ! if( NULL == ptFileName[0] ){ return 0; } // レッツオーポン hFile = CreateFile( ptFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE == hFile ){ return 0; } //InitLastOpen( INIT_SAVE, ptFileName ); // 複数ファイルでは意味が無い // 処理順番入替 iByteSize = GetFileSize( hFile, NULL ); pBuffer = malloc( iByteSize + 4 ); // バッファは少し大きめに取る ZeroMemory( pBuffer, iByteSize + 4 ); SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); ReadFile( hFile, pBuffer, iByteSize, &readed, NULL ); CloseHandle( hFile ); // 内容全部取り込んだから開放 // ユニコードチェック CopyMemory( &rtUniBuf, pBuffer, 2 ); if( rtHead == rtUniBuf ) // ユニコードヘッダがあれば { ptString = (LPTSTR)pBuffer; ptString++; // ユニコードヘッダ分進めておく } else { pcText = (LPSTR)pBuffer; // シフトJISを開く場合、�の部分をどうにかせんといかん ptString = SjisDecodeAlloc( pcText ); // ファイルを開くとき FREE( pBuffer ); // こっちで開放 pBuffer = ptString; // ポイントするところを変更 } StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); #ifdef BIG_TEXT_SEPARATE // 頁区切りのないTXTかどうかを確認する dSepRslt = DocFileHugeCheck( ptString, cchSize ); if( 1 == dSepRslt ) // 分割処理する { ptSepBuff = DocFileHugeSeparate( ptString, cchSize ); if( !(ptSepBuff) ){ return 0; } // なんかミスってるなら中止 FREE( pBuffer ); // 大本を一旦開放 pBuffer = ptSepBuff; // 最後に開放する領域としてポイントするところを変更 ptString = ptSepBuff; // 読込処理を続ける位置としてセット StringCchLength( ptString, STRSAFE_MAX_CCH , &cchSize ); // サイズ読込直し } else if( 2 == dSepRslt ) // 読込中止 { FREE( pBuffer ); // 大本を開放 return 0; } // 0なら何もしない #endif // 新しいファイル置き場の準備 2014/05/28↑にあったのを移動した dNumber = DocMultiFileCreate( NULL ); // 実際のファイルを開くとき if( 0 >= dNumber ) return 0; StringCchCopy( (*gitFileIt).atFileName, MAX_PATH, ptFileName ); // もしASTなら、先頭は[AA]になってるはず・分割は中でやる if( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) { DocStringSplitMLT( ptString , cchSize, DocPageLoad ); } else { DocStringSplitAST( ptString , cchSize, DocPageLoad ); } // ファイル開いたらキャレットとかスクロールをリセットする ViewEditReset( ); FREE( pBuffer ); // =ptString DocPageChange( 0 ); // 全部読み込んだので最初のページを表示する PageListViewChange( -1, -1 ); // 直前頁リセット AppTitleChange( ptFileName ); #ifdef _DEBUG dTcEnd = GetTickCount( ); TRACE( TEXT("LOAD START[%u] END[%u] ELAPSE[%u]"), dTcStart, dTcEnd, (dTcEnd - dTcStart) ); #endif return dNumber; }
/*! ユーザ定義のアレを読み込む @param[in] hWnd メインウインドウハンドル @param[in] bFirst 今回が最初であるか @return 非0中身取った処理した 0ファイルなかった */ INT UserDefInitialise( HWND hWnd, UINT bFirst ) { CONST WCHAR rtHead = 0xFEFF; // ユニコードテキストヘッダ WCHAR rtUniBuf; HANDLE hFile; DWORD readed; LPVOID pBuffer; // 文字列バッファ用ポインター INT iByteSize; LPTSTR ptString; LPSTR pcText; UINT cchSize; if( bFirst ) // 最初ならパス作っておく { ZeroMemory( gatUsDfPath, sizeof(gatUsDfPath) ); StringCchCopy( gatUsDfPath, MAX_PATH, ExePathGet() ); PathAppend( gatUsDfPath, TEMPLATE_DIR ); PathAppend( gatUsDfPath, USER_ITEM_FILE ); } hFile = CreateFile( gatUsDfPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE == hFile ){ return 0; } // 今の内容破棄 UserDefObliterate( hWnd ); iByteSize = GetFileSize( hFile, NULL ); pBuffer = malloc( iByteSize + 2 ); ZeroMemory( pBuffer, iByteSize + 2 ); // 中身をいただく SetFilePointer( hFile, 0, NULL, FILE_BEGIN ); ReadFile( hFile, pBuffer, iByteSize, &readed, NULL ); CloseHandle( hFile ); // 内容全部取り込んだから開放 // ユニコードチャック CopyMemory( &rtUniBuf, pBuffer, 2 ); if( rtHead == rtUniBuf ) // ユニコードヘッダがあれば { ptString = (LPTSTR)pBuffer; ptString++; // ユニコードヘッダ分進めておく } else { pcText = (LPSTR)pBuffer; // シフトJISを開く場合、�の部分をどうにかせんといかん ptString = SjisDecodeAlloc( pcText ); // SJISの内容をユニコードにする FREE( pBuffer ); // こっちで開放 pBuffer = ptString; // ポイントするところを変更 } StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize ); // ASTじゃなきゃダメ if( !( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) ) { DocStringSplitAST( ptString , cchSize, UserDefItemLoad ); } FREE( pBuffer ); UserDefAppendMenu( hWnd ); return 1; }