محاكي الانعكاس الطرفي - التكامل مع IE
-
03-07-2019 - |
سؤال
أحاول تنفيذ بعض التكامل بين تطبيق قديم يعمل في Reflection Terminal Emulator وتطبيق قائم على المتصفح يعمل في IE.
أنا أستخدم البرامج النصية التي بدأها المضيف بحيث يتم عزل مشكلات الصيانة والنشر إلى التطبيق القديم.سيتم إنشاء جميع البرامج النصية في التطبيق القديم وإرسالها إلى Reflection باستخدام تسلسلات الهروب.
أنا حاليا قادر على:
- إطلاق آي إي
- قم بتعيين الخيارات مثل إخفاء أشرطة الأدوات
- انتقل إلى عنوان URL
- إرسال معلومات الحالة مرة أخرى إلى التطبيق القديم
- انتظر إشارة "إغلاق" من التطبيق القديم
- إغلاق آي إي
إليك كود VBA للقيام بذلك:
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.ToolBar = false
objIE.Navigate("http://www.google.com/")
objIE.Visible = true
Session.Transmit "OK" & CR
Session.WaitForString "CLOSE", 0, rcAllowKeystrokes
objIE.Quit
End Sub
تكمن المشكلة في ذلك في استمرار تشغيل البرنامج النصي حتى يحصل على أمر الإغلاق من التطبيق القديم.
ما أريد فعله هو استخدام برنامج نصي واحد لتشغيل المتصفح، وآخر لإغلاقه أو إعادة استخدامه لعنوان URL آخر.ومع ذلك، لم أتمكن من العثور على طريقة لحفظ مرجعي إلى IE عبر استدعاءات البرنامج النصي.لم يساعد الإعلان عن objiE على أنه عالمي خارج Sub Main.يستمر كائن الجلسة عبر استدعاءات البرامج النصية، ولكن لا يبدو أنه يحتوي على خاصية يمكنني استخدامها لهذا الغرض.(تحتوي الجلسة على خاصية UserData، ولكنها عبارة عن سلسلة وليست كائنًا.)
إليك مثال على ما أود القيام به:
البرنامج النصي 1 - افتح IE واتركه مفتوحًا:
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.ToolBar = false
objIE.Navigate("http://www.google.com/")
objIE.Visible = true
Session.Transmit "OK" & CR
End Sub
البرنامج النصي 2 - أرسل نافذة IE الأصلية إلى عنوان URL الجديد
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = FindOriginalIE()
objIE.Navigate("http://www.stackoverflow.com/")
Session.Transmit "OK" & CR
End Sub
البرنامج النصي 3 - أغلق IE
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = FindOriginalIE()
objIE.Quit
Session.Transmit "OK" & CR
End Sub
الجزء الذي لا أستطيع اكتشافه هو كيفية تنفيذ وظيفة FindOriginalIE() المستخدمة في البرامج النصية 2 و3.
لقد حاولت استخدام GetObject() بدلاً من CreateObject()، لكن ذلك لم يوصلني إلى أي مكان.لن يقوم GetObject() بفتح نافذة IE جديدة أو العثور على نافذة موجودة.أظن أن السبب في ذلك هو أنني أعمل تحت Citrix، لكنني لست متأكدًا.
خيوطي الوحيدة الآن هي محاولة استخدام hWND الخاص بـ IE لإعادة الاتصال بالنافذة الأصلية، أو استخدام DDE بدلاً من OLE.ومع ذلك، لم يحالفني الحظ كثيرًا مع أي منهما، ويرجع ذلك أساسًا إلى نقص الوثائق.
إذن أسئلتي هي:
- هذا هو ، هل هناك طريقة لاستمرار مقبض بلدي إلى IE عبر هل تستضيف مكالمات البرنامج النصي التي بدأتها؟
- Should I expect GetObject() to work, or is that a dead end?
- Is it possible to use the Win32 API in a host initiated script to re-connect to IE using hWND?
أي روابط للمقالات ذات الصلة أو نموذج التعليمات البرمجية أو الأفكار الأخرى هي محل تقدير كبير.
المحلول
AFAIK GetObject غير مدعوم لكائن InternetExplorer.ولكن هذه ليست النهاية :) بين العديد من الطرق الأخرى يمكنك إخراجها من مجموعة windows الخاصة بـ shell32.لكي يعمل رمز المثال (المقتبس من الكود الموجود في الرابط أعلاه) تحتاج إلى تعيين مرجع لما يلي:
- ضوابط إنترنت مايكروسوفت
- مكتبة كائنات Microsoft HTML
- عناصر التحكم والأتمتة في Microsoft Shell
Public Sub RunMeFirst()
Dim objIE As SHDocVw.InternetExplorer
Set objIE = New SHDocVw.InternetExplorer
objIE.Visible = True
objIE.navigate "http://www.google.com/"
Do Until objIE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
End Sub
تشغيل فرعي عام()
Dim objIE As SHDocVw.InternetExplorer
خافت وثيقة كما MSHTML. أ دوكومنت
تعيين objIE = GetIEByURL("http://www.google.com/")
تعيين doc = objIE.document
MsgBox doc.body.innerText
نهاية الفرعية
وظيفة خاصة GetIEByURL (ByVal URL كسلسلة) كما SHDocVw.InternetExplorer
خافت objShell كما شل 32.Shell
خافت objExplorer كما Shell32.ShellFolderView
خافت obj ككائن
تعيين objShell = شل جديد
لكل obj في objShell.Windows
إذا كان نوع obj هو SHDocVw.InternetExplorer ثم
إذا كان StrComp(obj. عنوان URL للموقع ، عنوان URL ، vbTextCompare) = 0& ثم
خروج ل
إنهاء إذا
إنهاء إذا
التالي obj
تعيين GetIEByURL = obj
وظيفة النهاية
أعتقد أنه قد يكون من المفيد مناقشة ما تحاول تحقيقه بالرغم من ذلك.يعد Roboting IE أسلوبًا مبتذلاً للغاية (وأنا غالبًا ما أكون مذنبًا به)، ولكن قد تكون هناك طريقة أفضل وأقل استهلاكًا للموارد.