Автор Тема: Печать из приложений WPF (Print Ticket API)  (Прочитано 4441 раз)

Оффлайн a_korolev

  • Начинающий
  • *
  • Сообщений: 7
    • Email
Добрый день!

Wine (i586-wine-3.13.3-alt0.M80P.1). При помощи winetricks установлен .NET 4.5. Под всем этим запускается и вполне успешно функционирует .NET/WPF приложение.
Проблема с невозможностью вывести что-либо на принтер. При попытке что-либо напечатать возникает исключение:
Цитировать
External component has thrown an exception.
StackTrace:
   at MS.Internal.Printing.Configuration.UnsafeNativeMethods.PTOpenProviderExImpl(String deviceName, Int32 maxVersion, Int32 prefVersion, SafePTProviderHandle& handle, Int32& usedVersion)
   at MS.Internal.Printing.Configuration.UnsafeNativeMethods.PTOpenProviderEx(String deviceName, Int32 maxVersion, Int32 prefVersion, SafePTProviderHandle& handle, Int32& usedVersion)
   at MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion)
   at MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion)
   at System.Printing.Interop.PrintTicketConverter..ctor(String deviceName, Int32 clientPrintSchemaVersion)
   at MS.Internal.Printing.Win32PrintDialog.ProbeForPrintingSupport()
   at MS.Internal.Printing.Win32PrintDialog.ShowDialog()
   at System.Windows.Controls.PrintDialog.ShowDialog()
Wine выводит в консоль следующее:
Цитировать
wine: Call from 0x7b43d526 to unimplemented function prntvpt.dll.PTOpenProviderEx, aborting
wine: Call from 0x7b43d526 to unimplemented function prntvpt.dll.PTOpenProviderEx, aborting
wine: Call from 0x7b43d526 to unimplemented function prntvpt.dll.PTOpenProviderEx, aborting

Дело в том, что WPF для печати использует Print Ticket API, реализуемое библиотекой prntvpt.dll. В Wine все функции этой библиотеки реализованы в виде "заглушек" (stub или FIXME, см. https://source.winehq.org/source/dlls/prntvpt/).

Попытка заменить в winecfg библиотеку prntvpt.dll на нативную из Windows7 x86 к успеху не приводит. Стэк ошибки тот же, вывод в консоль WINE несколько изменяется:
Цитировать
0009:fixme:winspool:GetPrinterW Unimplemented level 1
0009:fixme:ntdll:EtwEventRegister ({c89b991e-3b48-49b2-80d3-ac000dfc9749}, 0x2e458f6d, 0x2e46c3b8, 0x2e46d960) stub.
wine: Call from 0x7bc77ff1 to unimplemented function GDI32.dll.GdiIsUMPDSandboxingEnabled, aborting
wine: Call from 0x7b43d526 to unimplemented function GDI32.dll.GdiIsUMPDSandboxingEnabled, aborting
wine: Call from 0x7b43d526 to unimplemented function GDI32.dll.GdiIsUMPDSandboxingEnabled, aborting

Очень прошу помочь в решении данной проблемы.

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 222
Re: Печать из приложений WPF (Print Ticket API)
« Ответ #1 : 03.10.2018 11:54:07 »
На этом форме вам вряд ли помогут.
А через MONO это приложение может запускаться?

Попробуйте взять prntvpt.dll из XP.

И зарепортить про "unimplemented function prntvpt.dll.PTOpenProviderEx" (примерно как https://bugs.winehq.org/show_bug.cgi?id=37970)
« Последнее редактирование: 03.10.2018 12:02:43 от yaleks »

Оффлайн a_korolev

  • Начинающий
  • *
  • Сообщений: 7
    • Email
Re: Печать из приложений WPF (Print Ticket API)
« Ответ #2 : 03.10.2018 12:02:54 »
На этом форме вам вряд ли помогут.
А где есть шансы на помощь?
А через MONO это приложение может запускаться?
Нет, под MONO ведь WPF не работает :(

Оффлайн a_korolev

  • Начинающий
  • *
  • Сообщений: 7
    • Email
Re: Печать из приложений WPF (Print Ticket API)
« Ответ #3 : 03.10.2018 12:09:18 »
И зарепортить про "unimplemented function prntvpt.dll.PTOpenProviderEx" (примерно как https://bugs.winehq.org/show_bug.cgi?id=37970)
Они ее и заимплементили как E_NOIMPL :)
HRESULT WINAPI PTQuerySchemaVersionSupport(PCWSTR printer, DWORD *version)
{
    FIXME("stub:%s %p\n", debugstr_w(printer), version);
    return E_NOTIMPL;
}
Чтоб все по факту заработало, нужно "честно" реализовать 3 десятка функций этой dll, некоторые из них не документированы.

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 222
Re: Печать из приложений WPF (Print Ticket API)
« Ответ #4 : 03.10.2018 12:36:54 »
А PTOpenProviderEx вообще никак не имплементирован, даже в виде stub'а.