2012-12-05 57 views
7

我有一个VB6程序迁移到C#.NET的GuiApplication 3.5 用户启动SAP登录并验证, 那么他就可以使用该工具使用该工具 获取并插入数据问题:我 可以创建与反思新GuiApplication,但我不能用它获取当前打开的GuiSessions:/ 这里是获取当前所有打开GuiSessions打开GuiApplication代码的VB6部分获得运行SAP登录VB6到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 

我用反射试了一下:

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

我得到了一个实例,但没有现有会话

回答

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); 


     } 

使用这种方法,你必须引用SapROTWr.DLL这是在SAP的安装文件夹SAPGUI能够访问。

+0

谢谢,将检查出来,如果它工作将标记为答案 –

+0

它帮助了我。真的很感谢你的时间。 –

1

假设SAPGUI是一个COM对象,那么你应该能够采取对它的引用,并创建为不使用反射的新对象。即使原始VB6代码使用'后期绑定',即使原始VB6代码使用'后期绑定',也使用早期绑定而不是后期绑定。其次,假设后期绑定,Type.GetTypeFromProgID("SapGui.S‌criptingCtrl.1")片段不应该是Type.GetTypeFromProgID("SapGui")以匹配原始VB6?您可能需要检查SAPGUI的对象模型以确保您引用的是正确的对象。

+0

问题是,我不希望创建一个新的对象,我想获得当前正在运行的saplogon.exe的会议 作为Type.GetTypeFromProgID(“SapGui”)我甚至没有得到GuiApplication(我得到空),与SapGui.ScriptingCtrl.1我得到saplogon.exe绑定,但不是会话:/ –

+0

当然,VB6中的GetScriptingEngine调用连接到当前正在运行的实例? VB6代码中没有任何东西可以与它相提并论。因此你可以在.NET代码中使用相同的调用。或者还有其他问题没有在您的问题中显示? –

+0

我称之为vb6代码atm,它给了我所有连接和会话的guiapplication 如果我这样做(反射+获取脚本引擎并允许系统消息)我只得到没有连接的guiapplication,并且没有存储在连接中的会话,我开始后,我有权访问脚本引擎,但这不足以令我伤心(对应用程序的要求:/) –

0

,我发现与正在运行的会话工作的唯一解决方案是通过C#来加载代码在一个DLL和访问它

0

SAP释放SAP .NET连接器以提供standartized方式从内与SAP系统交互.NET应用程序。看看http://service.sap.com/connectors,你必须是SAP的合作伙伴是页面

+0

因此,如果我在sap登录中打开会话并填充所有数据,当我使用sap .net连接器我可以访问数据? –

+1

@GoranŠtuc如果数据将被保存到数据库 - 是的。如果它只会在屏幕上 - 不。在.NET Connector的帮助下,您可以轻松地从SAP侧调用功能模块,但无法访问saplogon屏幕。在这种情况下,你将负责创建整个guiT –

+1

谢谢,这意味着我需要一些其他解决方案:/ –

2

这对我的作品(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

非常感谢你为我工作 – user2682809