У меня есть приложение MS-Access 2010. Я использую Sumatra PDF в качестве программы для просмотра PDF-файлов. Чтобы средство просмотра соответствовало приложению, я загрузил его в подчиненную форму, используя этот простой код:
Private Sub Form_Load() 'subform load procedure
Dim inpFile As String, cmd As String
inpFile = "D:\temp\test.pdf"
cmd = CurrentProject.Path & "\SumatraPDF-3.5.2-32.exe -plugin " & _
Me.Hwnd & " """ & inpFile & """"
runShell cmd
End Sub
Private Function runShell(ByVal cmd As String)
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
wsh.Run cmd, vbHide, False
Set wsh = Nothing
End Function
Это работает нормально. Однако я хотел бы взаимодействовать с PDF-документом из моего приложения VBA с помощью команд DDE (Sumatra PDF поддерживает DDE начиная с версии 3.5).
Если я запускаю Суматру как приложение, я могу использовать этот пример кода для отправки команды выбора копии:
Private Sub Command1_Click()
Dim channelNumber As Long
channelNumber = Application.DDEInitiate("SUMATRA", "control")
Application.DDEExecute channelNumber, "[CmdCopySelection]"
Application.DDETerminate channelNumber
End Sub
Поскольку Суматра загружается в подчиненную форму, доступное приложение Суматра отсутствует, поэтому инициализация DDE завершается неудачно. Однако Суматра протекает как процесс...
Существует также усложняющий фактор: у моих пользователей может быть открыто несколько экземпляров средств просмотра PDF в подчиненных формах, а в приложении есть несколько пользователей, которые могут открывать средства просмотра PDF одновременно.
Мой вопрос: есть ли способ определить правильный канал DDE для процесса Суматры, который выполняется в моей подформе? Могу ли я использовать для этого вызов API, используя Hwnd подчиненной формы? Если это возможно, можете ли вы дать мне пример кода?
Первоначальное использование DDE для управления SumatraPDF в качестве «предварительного просмотра» (неправильное название, поскольку PDF всегда просматривается после рендеринга) было разработано Уильямом Блюмом для использования с LaTeX IDE (WinEdt) в основном в 2008 году. Это позволяет использовать сервер: SUMATRA Тема: управление WM_DDE_EXECUTE: Команда[ы].
Теперь это ключевое средство навигации во время выполнения, поэтому открытие документа «Имя файла» через командную строку с SumatraPDF, уже «активно обслуживающим», будет использовать DDE CONTROL для обработки многих внутренних команд. Если он не работает с именем файла, он будет самообслуживаться после начала нормальной работы.
Одна из проблем заключается в том, что DDE имеет несколько ограничений, налагаемых Windows. Например, если запущен непользовательский сеанс, вызов пользовательской командной строки для открытия файла должен завершиться неудачей. Аналогичные ограничения UAC могут применяться при запуске смешанных 32-битных и 64-битных сеансов.
Система подключаемого модуля «Предварительный просмотр» была в первую очередь разработана для браузеров на базе Netscape (устарела в 2015 г.), и любое остаточное использование «Предварительных просмотров» PDF-файлов в Explorer, таких как «MS Outlook», является полностью неподдерживаемым устаревшим побочным эффектом. Поскольку панель «Браузер» находится в «песочнице», ее собственные возможности ограничены за счет ограничения небезопасных функций пользовательского интерфейса.
В режиме Plug-in не должно быть внешнего управления.
Таким образом, DDE работает в одном направлении через один узкий канал «управления», предоставляя внешние функциональные возможности. Не существует существенных средств для раскрытия «внутренних» состояний или данных.
Было сделано несколько запросов для запроса DDE, например, «Текущая» страница или состояние масштабирования, но такого внешнего механизма обратной связи не существует.
Если вы можете запустить команду VB при выборе пользователя, она ничем не будет отличаться от собственной команды Windows «Clip» или клавиши отправки WSH CTRL + C для копирования выбора пользователя в буфер обмена.
Привет, KJ, Спасибо за подробное объяснение. Теперь я понимаю, почему это не сработает. Я уже сталкивался с этим: «если запущен непользовательский сеанс, вызов пользовательской командной строки для открытия файла должен завершиться неудачей». Это тоже теперь объяснено. Мне по-прежнему повезло, что «неподдерживаемый побочный эффект устаревшей формы» сработал для меня, позволив средству просмотра находиться в подчиненной форме, что сделало ее частью приложения. Еще раз спасибо, с уважением, Эмфирио.