Page 45 of 47

PictureView 3 — просмотр изображений различных форматов

Posted: Sun 07 Apr, 2013 22:25
by SEt
В этой теме обсуждается плагин PictureView 3.
Старый тред с обсуждением предыдущих версий: PictureView 1 и 2.

Дальнейшее развитие версии 1.5, переделано под API Far 3.0.



Об извлечении плагинов из дистрибутивов ACDSee.


PS: API как было убогим в Far 2, так и осталось...

PictureView 3 — просмотр изображений различных форматов

Posted: Tue 28 May, 2019 21:27
by HaRT

Latest post of the previous page:

Спасибо, что продолжаете развивать свой замечательный плагин!
SEt wrote:
Tue 28 May, 2019 18:56
Новый декодер: ITP. Интерфейс для системных IThumbnailProvider декодеров – то, что использует Explorer для рисования картинок файлов. Показывает один кадр для видео. Поддерживает всевозможные внешние декодеры, которые можно установить в систему (например, декодер SVG), только обратите внимание на соответствие битности декодера и битности Far'а. Приоритет 0, то есть работает только при форсированном запуске (по префиксу, через меню плагинов, при отключенном быстром распознавании форматов).
Вопрос: то, что для видеофайлов (MOV/AVI) с кодеком JPEG/MJPG используется не ITP, а ACDSee:JPG (независимо от [?] Skip quick format detection), — это ожидаемо?

PictureView 3 — просмотр изображений различных форматов

Posted: Tue 28 May, 2019 22:17
by SEt
Да: у ITP очень низкий приоритет – его спрашивают последним. А ACDSee декодер имеет свойство искать JPEG в некоторой окрестности, а не только с начала файла.

В принципе, сейчас можно полностью отказаться от IDE_ACDStd.apl – другие декодеры быстрее или лучше.

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 31 May, 2019 12:50
by Grom PE
Хотел обновиться, потом вспомнил, что нужна версия с зумом nearest neighbor. Не выношу размытости при кратном зуме больше 100%. Почему бы не сделать опцию?

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 31 May, 2019 22:40
by SEt
Grom PE wrote:
Fri 31 May, 2019 12:50
Хотел обновиться, потом вспомнил, что нужна версия с зумом nearest neighbor.
Декодеры в большинстве случаев можно безопасно обновлять без изменения самого PV.
Если у вас и так всё работает – то новые заплатки вам не нужны.
Grom PE wrote:
Fri 31 May, 2019 12:50
Почему бы не сделать опцию?
Возможно, я дойду до этого.

PictureView 3 — просмотр изображений различных форматов

Posted: Thu 05 Sep, 2019 12:12
by a'Lexus
На билдах Far старше 5457, при открытом через ArcLite архиве на одной панели, рушит Far после попытки смены диска или создания каталога на второй панели.

Code: Select all

   ╔══════════════════════════ Exception occurred ══════════════════════════╗
   ║ Exception:   0xC0000005 - EXCEPTION_ACCESS_VIOLATION                   ║
   ║ Details:     Memory at 00007FF8C7B22820 could not be read              ║
   ║ errno:                                                                 ║
   ║ LastError:                                                             ║
   ║ NTSTATUS:                                                              ║
   ║ Address:     0x7FF77532BE8E - Far.exe!<unknown> (get the pdb)          ║
   ║ Source:                                                                ║
   ║ Function:    main                                                      ║
   ║ Module:      D:\Far Manager\Far.exe                                    ║
   ╟────────────────────────────────────────────────────────────────────────╢
   ║          { Terminate Far } [ Stack ] [ Minidump ] [ Ignore ]           ║
   ╚════════════════════════════════════════════════════════════════════════╝

PictureView 3 — просмотр изображений различных форматов

Posted: Thu 05 Sep, 2019 13:40
by HaRT
a'Lexus, сделайте, как написано тут: Поведение при обнаружении проблем.
И если рядом с Far.exe подложить соответствующий Far.pdb (например, скачать свежий Фар и оттуда же для него архив с PDB-файлом) и нажать в диаложке кнопку [ Stack ], то что выведется?

PictureView 3 — просмотр изображений различных форматов

Posted: Thu 05 Sep, 2019 22:52
by a'Lexus
Stack:

PictureView 3 — просмотр изображений различных форматов

Posted: Thu 05 Sep, 2019 23:30
by HaRT
a'Lexus wrote:
Thu 05 Sep, 2019 22:52
Stack:
А где выполненные предшествующие требования? Телепатов тут нет.

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 06:51
by a'Lexus

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 11:14
by HaRT
 ! Message from: HaRT
a'Lexus wrote:
Fri 06 Sep, 2019 06:51
Или пусть пользователи выявят проблему, поправят все сами, а вам дадут готовый результат?
Да, это предпочтительный вариант.
А пока на всякий случай перечитайте Правила. Судя по вашему тону, вы давно этого не делали.

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 11:32
by a'Lexus

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 12:58
by zg
a'Lexus wrote:
Fri 06 Sep, 2019 11:32
Стоит учесть,что указывая проблему, я оказываю вам услугу.
нет, если это не полноценный багрепорт.
1. очень часто в таких случаях реально ошибки нет. выясняется это долго, трата времени впустую.
2. даже если баг есть, то в итоге он проявится у того, кто сможет сделать полноценный багрепорт.

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 15:41
by John Doe
a'Lexus wrote:
Fri 06 Sep, 2019 06:51
Тупо скопировать в Plugins последниего билда Far плагин и проверить его работу не судьба?
Не воспроизводится.

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 15:52
by DrKnS
Господа, нет необходимости выяснять отношения - давайте исходить из того, что здесь никто никому ничего не должен.

a'Lexus, со стеком гораздо лучше, спасибо.

Очевидно, что кто-то опять неправильно работает с COM и вызывает лишний CoUninitialize, убивая этим ITaskbarList3 внутри фара.

В дистрибутиве плагина с COM работают вроде бы только ITP.pvd и WIC.pvd.

ITP.pvd:
  1. public pvdInit
  2. pvdInit proc near
  3. sub     rsp, 28h
  4. mov     edx, 6          ; dwCoInit
  5. xor     ecx, ecx        ; pvReserved
  6. call    cs:CoInitializeEx
  7. xor     ecx, ecx
  8. test    eax, eax
  9. setns   cl
  10. mov     eax, ecx
  11. add     rsp, 28h
  12. retn
  13. pvdInit endp
  14.  
  15. public pvdExit
  16. pvdExit proc near
  17. jmp     cs:CoUninitialize
  18. pvdExit endp
Предполагаю, это примерно соответствует
  1. bool pvdInit()
  2. {
  3.     return SUCCEEDED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));
  4. }
  5.  
  6. void pvdExit()
  7. {
  8.     CoUninitialize();
  9. }


WIC.pvd:
  1. public pvdInit
  2. pvdInit proc near
  3. ...
  4. sub     rsp, 48h
  5. mov     edx, 6          ; dwCoInit
  6. xor     ecx, ecx        ; pvReserved
  7. call    cs:CoInitializeEx
  8. test    eax, eax
  9. jns     short loc_18000121C
  10.  
  11. public pvdExit
  12. pvdExit proc near
  13. sub     rsp, 28h
  14. mov     rcx, cs:ppv
  15. mov     rax, [rcx]
  16. call    qword ptr [rax+10h]
  17. add     rsp, 28h
  18. jmp     cs:CoUninitialize
  19. pvdExit endp
Предполагаю, это примерно соответствует
  1. bool pvdInit()
  2. {
  3.     if (FAILED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)))
  4.         return false;
  5.     /* something */
  6. }
  7.  
  8. void pvdExit()
  9. {
  10.     /* something */
  11.     CoUninitialize();
  12. }

Я не знаю, как там работает интерфейс PVD и вызывается ли pvdExit, если pvdInit вернул false (исходников нет, документации нет, а ковыряться дальше мне лень). Если вызывается - ой, если нет - видимо, валит кто-то другой.
Но даже то, что выше - неправильно, т.к. модули не будут работать, если кто-то уже проинициализировал COM в другом режиме.

Как правильно инициализировать COM (у меня такое чувство, что нужна статья в Писании):
  1. void foo()
  2. {
  3.     HRESULT Result = CoInitializeEx(/* whatever */);
  4.     bool ComInitialized = SUCCEEDED(Result);
  5.     bool ComAvailable = ComInitialized || Result == RPC_E_CHANGED_MODE;
  6.  
  7.     if (ComAvailable)
  8.     {
  9.         // Use COM
  10.     }
  11.  
  12.     if (ComInitialized)
  13.         CoUninitialize();
  14. }

PictureView 3 — просмотр изображений различных форматов

Posted: Fri 06 Sep, 2019 18:06
by a'Lexus
John Doe wrote:
Fri 06 Sep, 2019 15:41
Не воспроизводится.
DrKnS wrote:
Fri 06 Sep, 2019 15:52
со стеком гораздо лучше, спасибо.
Может вот ,что еще поможет:/
Far30b5462.x64.20190902 работает без проблем, 5463 у меня нет, 5464 и более старшие крашатся сразу после запуска.
При повторном запуске - при смене диска или создании каталога.
Steck при запуске:


p.s. Смею предположить, что повлияло вот это:
drkns 02.09.2019 21:09:11 +0100 - build 5463
1. Инициализируем COM как multithreaded, вроде бы так правильнее в нашем случае.

PictureView 3 — просмотр изображений различных форматов

Posted: Sat 07 Sep, 2019 19:36
by Smitis
После 5462 ФАР начал падать, но только сегодня наконец собрался и выяснил, что это PictureView. Оказалось, это не только у меня.
Если что, есть стек, минидамп, но, как понял, это уже не нужно и причина выявлена.

PictureView 3 — просмотр изображений различных форматов

Posted: Sat 07 Sep, 2019 23:06
by SEt
Да, есть такое, в PV вызывался CoUninitialize при не успешном CoInitializeEx. В следующей версии будет исправлено.

Но в данном случае – это была очень полезная ошибка, так как иначе вот это прошло бы тихо:
drkns 02.09.2019 21:09:11 +0100 - build 5463
1. Инициализируем COM как multithreaded, вроде бы так правильнее в нашем случае.
Какая прекрасная идея: "вроде бы так правильнее"! А что должны сделать плагины? Как им понять, что теперь COM работает по-другому?

EDIT:
Ну и MSDN говорит, что
Because OLE technologies are not thread-safe, the OleInitialize function calls CoInitializeEx with the COINIT_APARTMENTTHREADED flag. As a result, an apartment that is initialized for multithreaded object concurrency cannot use the features enabled by OleInitialize.
Applications that use the following functionality must call OleInitialize before calling any other function in the COM library:
  • Clipboard
  • Drag and Drop
  • Object linking and embedding (OLE)
Так что в плагинах ещё что-то может принципиально отвалиться, если они теперь обязаны жить в COINIT_MULTITHREADED.