2012-12-05 90 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