C# SAP GUI 7.4 编写现有应用程序/连接/会话的脚本



我正在尝试编写一个 C# 程序,该程序将使用 SAP GUI 脚本 API 自动将用户输入到 SAP GUI(当前版本为 7400.3.11.3364)中。我过去使用 VBA 做过类似的事情,但我正在努力让它在 C# 中完全按照我想要的方式工作。

我的最终目标是有一个方法打开SAP GUI(如果它尚未运行),返回SAP GUI的GuiApplication对象,并在程序结束后使SAP GUI保持打开状态。我目前让它在 VBA 中工作,我相信当我们使用 SAP GUI 版本 7.3 时,我在以前的项目中在 C# 中正常工作,但我不是 100% 确定。

这是我使用的VBA函数:

Public Function GetSapApp() as GuiApplication

Dim Start as Date
If GetObject("SAPGUI") Is Nothing Then
Start = Now()
Shell "C:Program Files (x86)SAPFrontEndSAPguisaplogon.exe"
Do Until Not GetObject("SAPGUI") Is Nothing Or Now > (Start + TimeValue("00:01:00"))
DoEvents
Loop
If GetObject("SAPGUI") Is Nothing Then
MsgBox "Unable to detect SAP Scripting API. Please contact the developer."
End If
Set GetSapApp = GetObject("SAPGUI").GetScriptingEngine
End Function

以下是我在谷歌搜索时发现的不同 C# 方法:

  • 以下是我目前正在使用的(这个想法的灵感来自这个:https://www.codeproject.com/Questions/829500/How-do-I-connect-Csharp-to-SAP-GUI),但它有几个问题。如果SAP GUI已经打开,它似乎无法检测到。此外,在我的程序运行后,我们的任何 VBA 宏都无法检测到此 SAP GUI。

    private static GuiApplication GetSapApp()
    {
    try
    {
    object SapGuilRot = new CSapROTWrapper().GetROTEntry("SAPGUI");
    return SapGuilRot.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null) as GuiApplication;
    }
    catch (Exception e)
    {
    try
    {
    string SapPath = "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe";
    if (File.Exists(SapPath))
    {
    System.Diagnostics.Process.Start(SapPath);
    DateTime StartTime = DateTime.Now;
    object SapGuilRot = new CSapROTWrapper().GetROTEntry("SAPGUI");
    while (SapGuilRot == null && 30 >= (DateTime.Now - StartTime).TotalSeconds)
    {
    SapGuilRot = new CSapROTWrapper().GetROTEntry("SAPGUI");
    }
    return SapGuilRot.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null) as GuiApplication;
    }
    else
    {
    return null;
    }
    }
    catch
    {
    return null;
    }
    }
    }
    
  • 这是我尝试过的另一个选项(根据另一个 SO 帖子中的这个答案:https://stackoverflow.com/a/14205520/5134861),但它的第一个问题与上面相同(不检测 SAP 当前是否正在运行),调用OpenConnection方法时打开的 SAP GUI 会话看起来不同,然后在我的程序完成运行时关闭。

    private static GuiApplication GetSapApp()
    {
    return (GuiApplication)System.Activator.CreateInstance(Type.GetTypeFromProgID("SapGui.ScriptingCtrl.1"));
    }
    
  • 这是我尝试过的最后一个选项,但是尽管已验证sapfewse.ocx已注册,但我还是收到ActiveX component can't create object错误。

    private static GuiApplication GetSapApp()
    {
    object sap = Microsoft.VisualBasic.Interaction.GetObject("SAPGUI", "");
    return sap.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, sap, null) as GuiApplication;
    }
    

任何帮助和/或建议将不胜感激。

提前感谢!

我用过:

Microsoft.VisualBasic.Interaction.GetObject("SAPGUISERVER", "");
SapROTWr.CSapROTWrapper sapROTWrapper1 = new SapROTWr.CSapROTWrapper();
object SapGuilRot1 = sapROTWrapper1.GetROTEntry("SAPGUI");
object engine1 = SapGuilRot1.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot1, null);

相关内容

  • 没有找到相关文章