SAP COM VB6 VB.NET Разница в поведении

Я подключаюсь к SAP через COM, используя элементы управления ActiveX, перетащенные в форму. В VB6 я пишу:

Private Sub Form_Terminate()
    SAPBAPIControl.Connection.Logoff
End Sub

Private Sub SAPLogonControl_Click()
    Set SAPBAPIControl.Connection = SAPLogonControl.NewConnection
    SAPBAPIControl.Connection.Client = "100"
    If SAPBAPIControl.Connection.Logon(0, False) Then
        MsgBox SAPBAPIControl.Connection.IsConnected
    End If
End Sub

В VB.NET 2010 я пишу:

Public Class MainForm
    Private Sub MainForm_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    AxSAPBAPIControl1.Connection.Logoff()
End Sub

    Private Sub AxSAPLogonControl1_ClickEvent(sender As Object, e As System.EventArgs) Handles     AxSAPLogonControl1.ClickEvent
        AxSAPBAPIControl1.Connection = AxSAPLogonControl1.NewConnection()
        AxSAPBAPIControl1.Connection.Client = "100"
        If AxSAPBAPIControl1.Connection.Logon(0, False) Then
            MsgBox(AxSAPBAPIControl1.Connection.IsConnected)
        End If
    End Sub
End Class

и в итоге:

Единственная ошибка (первый шанс) типа "System.AccessViolationException" в mscorlib.dll aufgetreten. в .Клиент = "100"

VB6 просто работает.

Кто-нибудь знает, как передать объект подключения другому классу в VB.NET?

Спасибо за помощь.


person Johannes Maria Frank    schedule 11.10.2012    source источник
comment
Для получения помощи при сбое COM-серверов из-за нарушения прав доступа требуется поддержка поставщика.   -  person Hans Passant    schedule 12.10.2012
comment
Благодарим за ваше предложение. Но поставщиками, с которыми можно связаться, будут: Microsoft и SAP. Каково приблизительное предположение о моих шансах заставить их решить проблему? Поэтому, вероятно, мне лучше закрыть соединение и открывать его каждый раз, когда мне нужна другая функция. Я просто хотел бы избежать этого.   -  person Johannes Maria Frank    schedule 15.10.2012


Ответы (2)


Навскидку: вы используете Set в старом коде VB6, я думаю, что это влияет на объекты, связанные с VBA. Вы можете попробовать что-то вроде

AxSAPBAPIControl1 =  AxSAPBAPIControl1.Connection = AxSAPLogonControl1.NewConnection()

Я думаю, что AxSAPBAPIControl1 дает вам объект соединения и не изменяет себя, поэтому вы открываете новое соединение, которое никогда не используется, а затем используется «неподключенный» AxSAPBAPIControl1. Я не знаю SAP-Com, но в msoffice.interop иногда происходит такой крад. Пожалуйста, дайте мне отзыв.

person Christian Sauer    schedule 12.10.2012
comment
Спасибо, я пробовал это, но VB отказался из-за ошибки приведения типов. Добавление tpyecast CTYPE привело к синтаксической ошибке. - person Johannes Maria Frank; 12.10.2012

вместо VB.NET 2010 попробуйте с С# и сообщите нам, если у вас все еще есть та же проблема. когда я попытаюсь использовать vb.net для низкой связи, моя программа вылетит, затем я изменю некоторые части кода на dll в С#, и все заработает.

прежде чем вы создадите одну dll, вы должны попытаться перевести пример, опубликованный на С#, а затем посмотреть, исправлено ли оно

ваше здоровье

person Carlos Cocom    schedule 11.10.2012
comment
Какова цель этого комментария? - person Christian Sauer; 12.10.2012
comment
а какова цель вашего комментария. во время разработки программы, что случилось со мной, и вот как я это решил. если бы кто-то сказал мне раньше, я бы не потерял столько времени. Вот если и это у вас тоже не работает но может кто послужит. идея состоит в том, чтобы добавить, а не вычесть - person Carlos Cocom; 12.10.2012
comment
Спасибо за ваше предложение, я пробовал на C#, но столкнулся с разными проблемами, которые увели меня слишком далеко от моей цели. - person Johannes Maria Frank; 12.10.2012