2014-11-24 121 views
2

借助在stackoverflow上找到的代码示例,我成功地设法连接到SAP的EXISTING实例。如何停止脚本?

但是,我不知道如何脱离SAP并停止脚本。

我的代码完成后,在SAP窗口中,我仍然可以看到小理发师旋转起来,表明我仍然连接到它。

注意:我不想为用户终止会话。

我的意图是简单地勾住他们当前的连接,从他们的会话中获取一些信息,然后释放我的参与与他们的连接。

我想以'正确'的方式做到这一点..而不是猜测并将用户弄得一团糟。

下面是我使用进行连接(SapInfoSapInfoItem是我自己的结构)的脚本:运行与Excel VBA脚本时,我有同样的问题

public static Dictionary<string, SapInfoItem> get_sapInfo() 
{ 
    Dictionary<string, SapInfoItem> sapInfo = new Dictionary<string, SapInfoItem>(); 
    GuiApplication sapGuiApp; 

    SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
    object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
    object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod, 
    null, SapGuilRot, null); 

    sapGuiApp = engine as GuiApplication; 
    GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection; 

    foreach (GuiSession child_session in connection.Children) 
    { 
     GuiSession session = child_session as GuiSession; //connection.Children.ElementAt(0) as GuiSession; 
     SapInfoItem sii = new SapInfoItem(); 
     sii.system_name = session.Info.SystemName; 
     sii.client = session.Info.Client; 
     sii.client = session.Info.Program; 
     sii.screen_number = session.Info.ScreenNumber; 
     sii.handle = session.ActiveWindow.Handle; 
     sii.transaction = session.Info.Transaction; 

     sapInfo.Add(sii.handle.ToString("X"), sii); 
    } 

    connection.CloseConnection(); 

    return sapInfo; 
} 
+0

它已经很长一段时间,因为我已经处理了C#SAP自动化。我不记得,如果你杀掉了这个进程,你会弃用'GuiApplication'。我会从那里开始,也许尝试处理'engine'来查看它是否停止Gui自动化并将控制权释放回给用户。 – tyh 2014-11-24 20:25:55

回答

0

在脚本结束后,“小理发师”杆仍在运行,但我注意到停止宏是从SAP断开脚本。

事实上,这是因为我使用了一个公共变量来保存“会话”对象,所以它在脚本结束后仍然在内存中。我通过销毁脚本末尾的会话对象引用来解决问题。

因此,请检查您是否在代码末尾销毁了所有对公共对象的引用,它可以解决您的问题。

在VBA,代码要做到这一点是

Set session = Nothing 

在C#中,它应该是

obj = Null;