2012-12-05 3 views
7

Ich habe ein VB6 Programm in C# .net 3.5 der Benutzer startet SAP Logon und authentifiziert zu migrieren, dann kann er das Tool verwenden, um die Daten zu holen, und legen Sie mit dem Werkzeug das Problem: ich kann eine neue GuiApplication mit Reflexion schaffen, aber ich kann momentan nicht geöffnet GuiSessions mit ihm holen:/ hier ist der vB6 Teil des Codes, der zur Zeit GuiApplication mit allen geöffneten GuiSessionserhält GuiApplication von zu SAP Logon VB6 laufen C#

Dim obj As Object 
    Set obj = CreateObject("SAPGUI") 
    Set obj = obj.GetScriptingEngine 

    If TypeName(obj) = "GuiApplication" Then 
     Set SapAutomationObject = obj 
     SapAutomationObject.AllowSystemMessages = False 

     Debug.Print "SAP Automation OK" 
    End If 
geöffnet wird

Ich versuchte es mit Reflexion:

GuiApplication Application = (GuiApplication)System.Activator.CreateInstance(Type.GetTypeFromProgID("SapGui.S‌​criptingCtrl.1")); 

Ich habe eine Instanz aber keine bestehenden Sitzungen

Antwort

7
public static void testConnection() 
     { 
      SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
      object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
      object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod, 
       null, SapGuilRot, null); 
      SAPconnection.sapGuiApp = engine as GuiApplication; 
      GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection; 
      GuiSession session = connection.Children.ElementAt(0) as GuiSession; 
      MessageBox.Show(session.Info.User + " !!||!! " + session.Info.Transaction); 


     } 

Verwendung Diese Methode haben Sie SapROTWr.DLL zu verweisen, die in der sapgui Ordner Ihrer SAP-Installation ist.

+0

danke, werde es überprüfen, wenn es Works wird als Antwort –

+0

Es hat mir geholfen. Wirklich schätzen Sie Ihre Zeit. –

1

dass SAP GUI ist, sollte ein COM-Objekt dann Sie Unter der Annahme der Lage, einen Verweis auf sie zu nehmen und es als ein neues Objekt zu erstellen, ohne Reflexion verwendet wird. d. h. frühe Bindung und nicht späte Bindung verwenden, obwohl der ursprüngliche VB6-Code "späte Bindung" verwendet, sollte das Type.GetTypeFromProgID("SapGui.S‌criptingCtrl.1") Fragment nicht gleich Type.GetTypeFromProgID("SapGui") sein, um mit dem ursprünglichen VB6 übereinzustimmen? Möglicherweise müssen Sie das Objektmodell für SAPGUI überprüfen, um sicherzustellen, dass Sie das richtige Objekt referenzieren.

+0

das Problem ist, dass ich nicht wollen, um ein neues Objekt erstellen, möchte ich die aktuell laufenden saplogon.exe der Sessions wie bekommen Type.GetTypeFromProgID ("SapGui") ich bekomme nicht einmal GuiApplication (ich bekomme null), mit SapGui.ScriptingCtrl.1 bekomme ich die saplogon.exe gebunden, aber nicht die Sessions:/ –

+0

Sicherlich verbindet sich der GetScriptingEngine Aufruf in der VB6 die aktuell laufende Instanz? Es gibt nichts anderes im VB6-Code, der damit gleichgesetzt werden könnte. Sie würden also denselben Aufruf in Ihrem .NET-Code verwenden. Oder gibt es etwas anderes, das in Ihrer Frage nicht angezeigt wird? –

+0

ich nenne das vb6 code atm und es gibt mir die guiapplication mit allen Verbindungen und Sitzungen wenn ich das gleiche mache (reflection + get scripting engine und Systemmeldungen erlauben), bekomme ich nur guiapplication ohne die Verbindungen und ohne die in den Verbindungen gespeicherten Sitzungen , nachdem ich es gestartet habe, habe ich Zugriff auf die Scripting-Engine, aber das ist nicht genug für mich leider (Anforderungen für die Anwendungen: /) –

0

die einzige Lösung, die ich mit Laufeinheiten zu arbeiten, zu finden ist, dass Code in einer DLL und es

0

SAP freigegeben SAP .NET Connector über C# Zugang zu laden standartized Weg, um mit SAP-System zu interagieren innerhalb von .NET-Anwendung. Schauen Sie sich http://service.sap.com/connectors, müssen Sie SAP-Partner in der Lage den Zugriff auf sein auf die Seite

+0

so, wenn ich Sitzungen in SAP-Anmeldung öffnen und füllen Sie alle Daten, wenn ich sap .net verwenden Stecker ich kann auf die Daten zugreifen? –

+1

@Goran Štuc wenn die Daten in DB gespeichert werden - ja. Wenn es nur auf dem Bildschirm sein wird - nein. Mit Hilfe von .NET Connector können Sie einfach Funktionsmodul von SAP-Seite aufrufen, aber nicht auf Saplogon-Bildschirm zugreifen. In diesem Fall sind Sie verantwortlich für die Erstellung von ganzen GuiT –

+1

danke, das bedeutet, ich brauche eine andere Lösung:/ –

2

Dies funktioniert für mich (SAP-730/Win7):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SAPFEWSELib; 
using SapROTWr; 

namespace FIT.SapHelper 
{ 
    public static class stcSapHelper 
    { 
     public static void testConnection() 
     { 
      SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
      object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
      object engine = SapGuilRot.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null); 
      GuiConnection connection = (engine as GuiApplication).OpenConnection("BOX DESCRIPTION"); 
      GuiSession session = connection.Children.ElementAt(0) as GuiSession; 
     } 
    } 
} 
+0

Vielen Dank, es funktioniert für mich – user2682809