Моя конечная цель - иметь метод, который Открывает GUI SAP (если он еще не работает), возвращает объект GuiaPlication SAP GUI и оставляет SAP GUI открытым после окончания моей программы. В настоящее время у меня есть это в VBA, и я считаю, что я правильно работал в C# в предыдущем проекте, когда мы были в SAP GUI версии 7.3, но я не уверен на 100%. < /P>
Вот функция VBA, которую я использую: < /p>
Код: Выделить всё
Public Function GetSapApp() as GuiApplication
Dim Start as Date
If GetObject("SAPGUI") Is Nothing Then
Start = Now()
Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.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
< /code>
А вот различные методы C#, которые я нашел во время Googling: < /p>
[list]
[*] Ниже я то, что я В настоящее время используется (идея была вдохновлена этим: https://www.codeproject.com/questions/829500/how-do-i-connect-csharp-ta-sap-gui), но есть несколько проблем с это. Кажется, он не обнаруживает GUI SAP, если он уже открыт. Кроме того, после запуска моей программы этот графический интерфейс SAP не обнаруживается ни одним из наших макросов VBA. < /P>
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;
}
}
}
Код: Выделить всё
private static GuiApplication GetSapApp()
{
return (GuiApplication)System.Activator.CreateInstance(Type.GetTypeFromProgID("SapGui.ScriptingCtrl.1"));
}
Код: Выделить всё
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;
}
Любая помощь и/или предложения будут высоко оценены.
Спасибо заранее!
Подробнее здесь: https://stackoverflow.com/questions/492 ... on-session
Мобильная версия