Jarayondan tashqari ActiveX uchun SideBySide simulyatsiyasi

Biz mijoz tomoni nisbatan murakkab dasturni (ActiveX / .net / Delphi / C++ / COM) SxS dan foydalanishga moslashtirmoqdamiz, bu esa administrator bo'lmagan joylashuvga erishish va mahsulotimizning eski versiyalaridan izolyatsiya qilish imkonini beradi.

Biz .net ui, Delphi ui va biz procda ishlatadigan COM serverlari kabi deyarli barcha proc komponentlarimiz uchun bu maqsadga erishdik, bu jarayonda foydalanilgan barcha kutubxonalarni tavsiflovchi manifest faylni tuzib, ro'yxatdan o'tmasdan. har qanday komponentning mijozida (deyarli).

Va bu erda deyarli qism keladi: Ayni paytda bizning ilovamiz (uning c++ qismidan) proc dan tashqari ActiveX serverini (Delphi ActiveX EXE) chaqiradi, bu esa o'z navbatida boshqa proc ActiveX serverlarini (uchinchi tomon plaginlari, har qanday narsa bu erda ishlaydi, Delphi, C++, har qanday narsa, agar u ActiveX EXE proc dan tashqarida bo'lsa va bizning interfeyslarimizni amalga oshiradi).

Bizga ma'lumki SxS proc ActiveX serverlarini qo'llab-quvvatlamaydi. Va biz ushbu ob'ektlardan proc com serverlarida bo'lgani kabi, asosiy jarayonimizda foydalana olmaymiz, chunki bu bizning ilovamizni jiddiy qayta yozishni va hatto eng yomoni, uchinchi tomon vositalari va sotuvchilari tomonidan ishlatiladigan ochiq API-ning uzilishini talab qiladi, api. biz ruxsat bera olmaydigan buzilish.

Biz ushbu maqolaga duch keldik, unda IHTMLDocument2 faylini Internet Explorer oynasidan qanday chiqarish mumkinligi tasvirlangan. alohida jarayon. Bu bizni ushbu yondashuv haqida o'ylashga majbur qildi:

Biz ikkilamchi sun'iy yo'ldosh ilovasini/jarayonini yaratamiz, u ActiveX-ni jarayon serveridagi kabi ishga tushiradi. Keyin biz LresultFromObject va ObjectFromLresult sun'iy yo'ldoshdan ActiveX ob'ektiga havolani o'tkazish uchun asosiy ariza jarayoniga ariza. Sun'iy yo'ldosh ilovasi SxS rejimida ishlashga imkon beruvchi o'zining manifest fayliga ega bo'ladi.

Ushbu Delphi ActiveX EXE va uchinchi tomon AciveX EXE plaginlari o'rtasida muloqot qilish uchun xuddi shunday yondashuv qo'llaniladi.

Muqobil yechim mavjud, biz hozircha yuqoridagi taklif qilingan yechimdan afzal ko'rmaymiz, bu ikki jarayon o'rtasidagi aloqa kanalini ochish uchun .net remoting va .net com proksi sinflaridan foydalanish, com so'rovini .net ga tarjima qilish. remoting va ikkinchi jarayonda com ga qayting.

Shunday qilib, savol tug'iladi:

  1. Ushbu yondashuv haqida nima deb o'ylaysiz?
  2. Muammoning yaxshiroq yechimini ko'ryapsizmi?

person Alex Shnayder    schedule 14.01.2010    source manba


Javoblar (2)


Buni qilish mumkin. Nima kerak:

  • Ilova buni amalga oshirish uchun COM-ga tayanmasdan, o'zi serverni ishga tushirishi kerak. Sizga ro'yxatga olish kitobi tomonidan taqdim etilgan qo'shimcha bilvosita kerak emas, shunchaki CreateProcess() dan foydalaning.
  • Server o'z sinf fabrikalarini CoRegisterClassObject() bilan main() usulida ro'yxatdan o'tkazishi kerak.
  • Muhim: har bir zavod uchun foydalanadigan CLSID har bir xizmat ko'rsatish namunasi uchun noyob bo'lishi uchun o'zgartirilishi kerak. Bu mijozning to'g'ri serverga ulanishini ta'minlaydi. Men oddiygina CLSID sinf fabrikasi bilan jarayon identifikatorini XOR. Mijoz jarayon identifikatorini ham biladi, shuning uchun ham xuddi shunday o'zgartirishlar kiritishi mumkin.
  • Ilova ob'ekt zavodi paydo bo'lishini kutish uchun Sleep() chaqiruvi bilan siklda CoCreateInstance() ni chaqirishi kerak. Kamida 60 soniya o'tmaguncha muvaffaqiyatsizlikni e'lon qilmang (bu meni tishladi).
  • Ilovaga ham, serverga ham har bir proksi-server/stub DLL uchun <file> elementi va masofadan turib har bir interfeys uchun <comInterfaceExternProxyStub> elementlarni o'z ichiga olgan manifest kerak.
person Hans Passant    schedule 14.01.2010
comment
Agar noto'g'ri bo'lsam, meni tuzating, lekin sizning taklifingizda men taklif qilganimdek ObjectFromLresult ishlatilmaydi, to'g'rimi? CoRegisterClassObject haqida, uni aynan qayerda ro'yxatdan o'tkazadi, agar u registrda ro'yxatdan o'tmagan bo'lsa, hatto manifestda bo'lsa ham, mening ilovam CoCreateInstance yordamida uni qanday topishi mumkin? - person Alex Shnayder; 17.01.2010
comment
Unday emas. CoCreateInstance() uni ishlaydigan ob'ektlar jadvalida topadi. - person Hans Passant; 17.01.2010
comment
Katta rahmat, agar sizning yordamingiz bo'lmasa, men buni amalga oshirishim uchun yoshga to'lgan bo'lardim. - person Alex Shnayder; 20.01.2010
comment
Amalga oshirilgan interfeysga uzatishda muammoga duch keldim, HRESULT: 0x80004002 (E_NOINTERFACE) translatsiya operatsiyasida men bu xatoni olaman. Bu mantiqqa to'g'ri kelmaydi, chunki mening ob'ektim tegishli interfeysni amalga oshiradi va men har qanday g'oyalarni aks ettirish orqali mijoz ilovasidan nomi bo'yicha interfeys usullariga kirishim mumkinmi? - person Alex Shnayder; 20.01.2010
comment
Bu .net orqali amalga oshirilgan mijoz va server bilan bog'liq bo'lishi mumkin, men 100% ishonch hosil qilganimdan keyin qo'shimcha ma'lumot beradi. - person Alex Shnayder; 06.02.2010
comment
Ushbu yechimdan foydalanganda proksi-server va stub obyektlari qanday tanlanadi? - person codeshot; 21.01.2017
comment
Tugallangan ishga tushirishni kutish va muvaffaqiyatsiz ishga tushirishni aniqlash uchun bola yoki ota-ona jarayonida taym-autdan foydalanmaslik uchun qandaydir ma'lumotnomalarni hisoblash mumkinmi? - person codeshot; 21.01.2017
comment
Zavod ob'ekti ota-ona jarayonlarining butun umri davomida mavjud bo'lishini ta'minlash va bola o'sha vaqt davomida tirik qolishi, lekin undan keyin darhol chiqib ketishi uchun bolaga ma'lumot berishning bir usuli bormi? - person codeshot; 21.01.2017

Aleks,

nobugz to'g'ri, siz Delphi avtomatlashtirish exe faylingizning hozirda ishlayotgan jarayonidan MAQOMOTI ob'ektining namunasini yaratish uchun Ishlayotgan ob'ektlar jadvaliga kirishingiz mumkin.

Biroq, men tushuntirib bera olmaydigan katta muammoni topdim. Shu tarzda ishlaganda ob'ektga faqat variantni yuborish usuli orqali kira olaman.

Asosan, agar mening Active X exe faylim ro'yxatdan o'tmagan bo'lsa, masalan, interfeyslar orqali ob'ektni misol keltirmoqchi bo'lsam, "Interfeys qo'llab-quvvatlanmaydi" xatosini olaman:

WebUpdate: IAutomation;

WebUpdate := CoAutomation.Create; ‹-- Ishlamaydigan xato


WebUpdate: Variant;

WebUpdate := CreateOleObject('WebUpdate.Automation'); ‹-- Yaxshi ishlaydi

Agar faol x exe faylini regserver yordamida ro'yxatdan o'tkazsam, muammo yo'qoladi!

Go Figure!

person Community    schedule 23.03.2010
comment
Men Delpi bo'yicha mutaxassis emasman, lekin men tushunganimdek, Delphi com ramkasi ro'yxatga olish kitobida ro'yxatdan o'tgan va turdagi kutubxonalarda mavjud bo'lgan narsalarga (ayniqsa, kod ishlayotgani) yuqori darajada bog'langan, chunki u SxS ni samarasiz qilishda juda samarali. . Lekin bu ob'ektlarga emas, balki faqat interfeyslarga tegishli. Biz ROT va interfeyslarni nisbiy ro'yxatga olish va turdagi kutubxonalarni (CoClasses emas) birlashtirib, ushbu cheklovni aylanib o'tishga muvaffaq bo'ldik. - person Alex Shnayder; 25.03.2010
comment
Nisbatan deganda men registrda kutubxonaga boradigan butun yo'lni emas, balki faqat .\libName.dll ni joylashtiramiz, shunda har bir jarayon o'z papkasida libName.dll ni topishni kutishi mumkin. libName.dll hatto jarayonning o'zi ham bo'lishi mumkin, shuning uchun siz o'zingizning kodingizdagi interfeyslarga hech qanday tashvishsiz murojaat qilishingiz mumkin. - person Alex Shnayder; 25.03.2010