Я создал приложение автоматизации MFC, а также добавил исходный интерфейс (исходящий интерфейс) для событий. Я могу создать объект COM и получать уведомления о событиях в Excel VBA, но не в VBScript. Я несколько раз проверял приложение MFC, если что-то не так, но вроде все правильно. Я пробовал и на основе Dialog, и на SDI, но у обоих одна и та же проблема. Я попробовал проект ATL, который отлично работает как в VBA, так и в VBScript.
Вот Excel VBA - это работает:
Private WithEvents foo As Automate
Private Sub CommandButton1_Click()
Set foo = New Automate
foo.Show
End Sub
Private Sub foo_OnShow()
MsgBox "VBA Event called Succeeded"
End Sub
А вот VBScript — это не работает:
Set obj = WScript.CreateObject("Automate.Application", "ob_")
obj.Show()
Sub ob_OnShow()
MsgBox "Automate Client: OnShow"
End Sub
VBScript создает объект и вызывает метод Show()
, когда второй параметр ob_
не передан. Но когда передается ob_
, скрипт создает объект, успешно запрашивает IDispatch
, а затем по какой-то причине освобождает объект. Я тоже попробовал изменить Sub
на Function
. Я получаю следующую ошибку:
Есть идеи? Спасибо всем!
Среда: Win11, Visual Studio 2022.
Нашел проблему.
Следующий метод переопределяется:
virtual BOOL GetDispatchIID(IID* pIID);
который возвращает IID_IDispatch
, а не IID_IAutomate
.
Ваша программа завершает работу сразу после .show.
Обычно вы делаете
Do
Wscript.sleep 1000
Loop
В конце основного подзаголовка.
Ваша программа состоит из двух строк. В WScript ваша программа завершается после второй строки. Ваш обработчик событий также завершает работу.
В WScript вам нужно поддерживать работу вашей программы, если вам нужны события.
Это было правдой на протяжении 29 лет.
Вы тоже нашли решение? Если нет, то вы можете добавить эту информацию к своему вопросу, а не публиковать ее в качестве ответа.