سؤال

أحاول تنفيذ بعض التكامل بين تطبيق قديم يعمل في Reflection Terminal Emulator وتطبيق قائم على المتصفح يعمل في IE.

أنا أستخدم البرامج النصية التي بدأها المضيف بحيث يتم عزل مشكلات الصيانة والنشر إلى التطبيق القديم.سيتم إنشاء جميع البرامج النصية في التطبيق القديم وإرسالها إلى Reflection باستخدام تسلسلات الهروب.

أنا حاليا قادر على:

  1. إطلاق آي إي
  2. قم بتعيين الخيارات مثل إخفاء أشرطة الأدوات
  3. انتقل إلى عنوان URL
  4. إرسال معلومات الحالة مرة أخرى إلى التطبيق القديم
  5. انتظر إشارة "إغلاق" من التطبيق القديم
  6. إغلاق آي إي

إليك كود 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.ومع ذلك، لم يحالفني الحظ كثيرًا مع أي منهما، ويرجع ذلك أساسًا إلى نقص الوثائق.

إذن أسئلتي هي:

  1. هذا هو ، هل هناك طريقة لاستمرار مقبض بلدي إلى IE عبر هل تستضيف مكالمات البرنامج النصي التي بدأتها؟
  2. Should I expect GetObject() to work, or is that a dead end?
  3. 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.لكي يعمل رمز المثال (المقتبس من الكود الموجود في الرابط أعلاه) تحتاج إلى تعيين مرجع لما يلي:

  1. ضوابط إنترنت مايكروسوفت
  2. مكتبة كائنات Microsoft HTML
  3. عناصر التحكم والأتمتة في 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 أسلوبًا مبتذلاً للغاية (وأنا غالبًا ما أكون مذنبًا به)، ولكن قد تكون هناك طريقة أفضل وأقل استهلاكًا للموارد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top