我正在尝试编写一个 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);