Заставить приложение .net и приложение vb6 общаться друг с другом? - PullRequest
3 голосов
/ 11 августа 2011

У меня есть пара приложений, которые зависят друг от друга.Одним из них является надежное приложение vb6.Другой - мое долгожданное, незаметное использование технологии стелс и, вероятно, выигрышное приложение .net (2.0).Приложение vb6 запускает приложение systray.И если приложение VB6 будет закрыто, приложение systray отключится само собой, предполагая, что ему больше не нужно ничего делать (это работа по сохранению документов в базе данных).

Моя единственная оставшаяся проблема заключается в том, что произойдет, еслиПриложение systray аварийно завершает работу или не может выполнить свою работу из-за неустранимой ошибки.Вероятным результатом этого условия является то, что я выскакиваю модальное диалоговое окно, сообщающее пользователю «немедленно обратитесь в службу поддержки, потому что вы больше не можете сохранять документы».

Я думаю, что наихудший сценарий здесь заключается в том, что всякий раз, когда документобрабатывается в приложении vb6 (то есть пользователь заполняет документ, а его компоненты архивируются и сохраняются локально), мне просто нужно проверить, запущено ли приложение systray.Я не знаю, это кажется немного громоздким.Есть ли более элегантный подход?Есть ли какой-нибудь способ, которым я могу «сигнализировать» моему приложению vb6 / чтобы мое приложение vb6 слушало такой сигнал?

Ответы [ 5 ]

3 голосов
/ 11 августа 2011

То, что я делал в прошлом, - это библиотека классов в .NET, представленная как COM-объект (в информации о сборке установите для атрибута ComVisible значение true).

Таким образом, из VB6 вы можете вызывать методы, которые вы экспортировали из библиотеки классов .NET, а в C # вы можете иметь весь код, необходимый для обработки ситуации.

Таким образом, я пишу меньше кода на VB6 и больше на C #, где мы можем извлечь выгоду из лучшей обработки исключений (try-catch-finally), каркасов журналирования, таких как Log4Net и так далее ...

до сих пор это работало очень хорошо для меня.

0 голосов
/ 12 августа 2011

Я бы предложил использовать что-то вроде следующей функции на таймере:

'declaration for FindWindow API
Private Declare Function FindWindow _
        Lib "user32" _
        Alias "FindWindowA" _
       (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long



'Call the following on a timer with the Tray icon form caption
'when it goes False unleash hell
Private Function IsWindowLoaded(ByVal strWindowCaption As String) As Boolean
    Dim lHwnd As Long
    lHwnd = FindWindow(strWindowCaption, vbNullString)
    If lHwnd <> 0 Then
        IsWindowLoaded = True
    Else
        IsWindowLoaded = False
    End If
End Function
0 голосов
/ 11 августа 2011

У меня нет удобных деталей, но я использовал обмен сообщениями Windows для отправки WM_NULL в прошлом. Это составляет пинг-сообщение. Таким образом, приложение VB6 отправляет периодический пинг приложению systray. Если приложение systray не отвечает на пинг своевременно, то приложение VB6 знает, что оно зависло или не работает.

0 голосов
/ 11 августа 2011

Вы можете использовать WMI для проверки его работоспособности, используя код, подобный следующему:

dim foundIt
For Each Process in GetObject( "winmgmts://." ).InstancesOf( "win32_process" )
    If UCase( Process.name ) = "MYDOTNET.EXE" Then
        foundIt = true 
    End If
Next
if not foundIt then
    msgbox( "It's not running, so start the process")
end if

Обратите внимание, что написанное выше написано как VBscript, но должно работать как код VB6, который я бы подумал.

0 голосов
/ 11 августа 2011

Моим первым предположением было бы установление связи между ними. Пусть приложение VB6 отправит запрос PING через определенный интервал. Затем, если приложение VB6 не получает ответ или время ожидания запроса, выполните то, что вам нужно.

...