HRESULT MediaInfoWindow::FillTree(HWND root, const wchar_t *filename) { HTREEITEM file = InsertTreeviewItem(root, filename, TVI_ROOT); InsertTreeviewItem(root, C(L"Reading Infomation ...."), file); SendMessage(root, TVM_EXPAND, TVE_EXPAND, (LPARAM)file); DoEvents(); MediaInfo MI; // language wchar_t path[MAX_PATH]; wcscpy(path, g_apppath); wcscat(path, C(L"MediaInfoLanguageFile")); FILE *f = _wfopen(path, L"rb"); if (f) { wchar_t lang[102400] = L""; char tmp[1024]; wchar_t tmp2[1024]; USES_CONVERSION; while (fscanf(f, "%s", tmp, 1024, f) != EOF) { MultiByteToWideChar(CP_UTF8, 0, tmp, 1024, tmp2, 1024); if (wcsstr(tmp2, L";")) { wcscat(lang, tmp2); wcscat(lang, L"\n"); } } fclose(f); MI.Option(_T("Language"), W2T(lang)); } else { MI.Option(_T("Language")); } HANDLE h_file = CreateFileW (filename, GENERIC_READ, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); String str = L""; if (h_file != INVALID_HANDLE_VALUE) { __int64 filesize = 0; GetFileSizeEx(h_file, (LARGE_INTEGER*)&filesize); DWORD From_Buffer_Size = 0; unsigned char From_Buffer[1316]; MI.Open_Buffer_Init(filesize); __int64 last_seek_target, seek_target = -5; do { if (seek_target >= 0) last_seek_target = seek_target; if (!ReadFile(h_file, From_Buffer, 1316, &From_Buffer_Size, NULL) || From_Buffer_Size <= 0) break; size_t result = MI.Open_Buffer_Continue(From_Buffer, From_Buffer_Size); if ((result&0x08)==0x08) // 8 = all done break; seek_target = MI.Open_Buffer_Continue_GoTo_Get(); if (seek_target>=0) SetFilePointerEx(h_file, *(LARGE_INTEGER*)&seek_target, NULL, SEEK_SET); else if (seek_target >= filesize) break; } while (From_Buffer_Size>0 && last_seek_target != seek_target); MI.Open_Buffer_Finalize(); MI.Option(_T("Complete")); MI.Option(_T("Inform")); str = MI.Inform().c_str(); MI.Close(); CloseHandle(h_file); } wchar_t *p = (wchar_t*)str.c_str(); wchar_t *p2 = wcsstr(p, L"\n"); wchar_t tmp[1024]; bool next_is_a_header = true; //TreeView_DeleteAllItems (root); TreeView_DeleteItem(root, file); file = InsertTreeviewItem(root, filename, TVI_ROOT); wcscat(m_msg, filename); wcscat(m_msg, L"\r\n"); HTREEITEM insert_position = file; HTREEITEM headers[4096] = {0}; int headers_count = 0; wchar_t tbl[3][20]={L"\t", L"\t\t", L"\t\t\t"}; while (true) { if (p2) { p2[0] = NULL; p2 ++; } wcscpy(tmp, p); wcstrim(tmp); wcstrim(tmp, L'\n'); wcstrim(tmp, L'\r'); wcs_replace(tmp, L" ", L" "); if (tmp[0] == NULL || tmp[0] == L'\n' || tmp[0] == L'\r') { next_is_a_header = true; } else if (next_is_a_header) { next_is_a_header = false; headers[headers_count++] = insert_position = InsertTreeviewItem(root, tmp, file); wcscat(m_msg, tbl[0]); wcscat(m_msg, tmp); wcscat(m_msg, L"\r\n"); } else { InsertTreeviewItem(root, tmp, insert_position); wcscat(m_msg, tbl[1]); wcscat(m_msg, tmp); wcscat(m_msg, L"\r\n"); } if (!p2) break; p = p2; p2 = wcsstr(p2, L"\n"); } //add some items to the the tree view common control SendMessage(root, TVM_EXPAND, TVE_EXPAND, (LPARAM)file); for (int i=0; i<headers_count; i++) SendMessage(root, TVM_EXPAND, TVE_EXPAND, (LPARAM)headers[i]); TreeView_SelectItem (root, file); return S_OK; }