الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال بخصوص استدعاء تطبيق .exe

بدأه ( HASSAN ) في 1 يوليو 2011 · 18 رد · 1,916 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لدي برنامج Vb.net واثناء عمله يتوجب علي استدعاء تطبيق .exe مبرمج اصلا بال Vc++ .. لكن لكي استدعيه يجب علي ان اخزن البيانات في ملف txt ومن ثم استدعي ال .exe لكي يقرأ هذا الملف ومن ثم يعطيني النتنائج .. وهنا يحصل مشاكل ومن اهمها او اهمها على الاطلاق البطء لاني استدعيه كثيرا يعني مئات بل الاف المرات اثناء عمل البرنامج وفي كل مره استدعاء اخزن النتيجه في ملف ال txt ومن ثم يقرأ منه ملف ال exe وهكذا ... لذا البطء يكزن واضح .. سؤالي ما هو الحل ؟

عملية تحويل كود ال ..exe تحتاج وقت طويل .. وايضا ليس لدي الخبره لتحويل الكود مع ان الكود موجود لدي . .. ولا اعلم اذا يوجد برنامج يقوم بالتحويل ..

الان الحلول اما ان اجعل ملف ال exe يقرا من ال .net مباشره يعني دون التخزين في ملف txt .. وصلني معلومه انه استطيع ان اجعله يقرأ من داخل ال .net يمعنى من array علما بان الذي لدي عباره عن grids .. انتظر اقترحاتكم اسعدكم الله في الدارين ..

-----------

ملاحظه:- بودي ان اضع النقاط اكبر قدر ممكن لكن لكي لا يعتبرها البعض رشوة :D

تحياتي ..

--

شكل توضيحي :-

الحاله الحاليه لمبدأ العمل الان :-

post-168424-032716500 1309623253_thumb.j

----------

---------

الحاله المطلوبه هكذا :-

post-168424-077907800 1309623288_thumb.j

المرفقات
111.jpg222.jpg

تم تعديل هذه المشاركة بواسطة ( HASSAN ) في 2 يوليو 2011 في 19:15

#2

اووه السؤال مش في مكانه :ohmy: .. الان انتبهت . اذا تكرم احد الاحبه المشرفين نقله الى مكانه الطبيعي .. عذرا :rolleyes:

#3

اذا كان السورس لديك فلماذا لا تعدله ليستخدم Shared memory او Pipes او اي طريقة اخرى للـIPC بدلا من اغراقه بعمليات الـI/O ؟؟

هناك طرق ملتفة اذا لم تمتلك السورس لكنها تحتاج عمل Reversing للأداة، راجع اخر مشاركة لي في هذا الموضوع :

http://www.at4re.com/f/showthread.php?7936-%CA%D4%DB%ED%E1-assembler-%E3%E4-%CF%C7%CE%E1-%C8%D1%E4%C7%E3%CC-%E3%DA-%C5%D1%D3%C7%E1-%C7%E1%DF%E6%CF-%DF%E3%CA%DB%ED%D1-%28%C8%CF%E6%E4-%E3%E1%DD%C7%CA%29

1 −1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4
GamingMasteR كتب:

اذا كان السورس لديك فلماذا لا تعدله ليستخدم Shared memory او Pipes او اي طريقة اخرى للـIPC بدلا من اغراقه بعمليات الـI/O ؟؟

هناك طرق ملتفة اذا لم تمتلك السورس لكنها تحتاج عمل Reversing للأداة، راجع اخر مشاركة لي في هذا الموضوع :

http://www.at4re.com/f/showthread.php?7936-%CA%D4%DB%ED%E1-assembler-%E3%E4-%CF%C7%CE%E1-%C8%D1%E4%C7%E3%CC-%E3%DA-%C5%D1%D3%C7%E1-%C7%E1%DF%E6%CF-%DF%E3%CA%DB%ED%D1-%28%C8%CF%E6%E4-%E3%E1%DD%C7%CA%29

هناك شرح ل Z3r0n3 عن ال Pipes

/index.php?showtopic=240562

أشهد أن لا آله ألا الله و أشهد أن محمد رسول الله

#5

بوركت اخي GM لكن اولا دخلت الرابط واراد مني التسجيل .. الكود لدي ولكن الطريقه التي تتكلم عنها صراحه لست خبير بها او بالاحرى لا اعلم كيف تتم .

#6
king1_90 كتب:

هناك شرح ل Z3r0n3 عن ال Pipes

/index.php?showtopic=240562

جميل .. الظاهر هناك طريقه لكن سؤالي الان اخي كما ذكرت انا اقوم باستدعاء هذا البرنامج كثيرا يعني باستخدام الكونسل المعتاد وخزن البياتات في ملف txt ومن ثم قرائتها عن طريق الكونسول ومن ثم نسخ النتائج في ملف txt اخر ومن ثم برنامجي الدوت نت يقرا هذه النتائج فلاحظ كم تحتاج وقت .. الان اريد ان استغني عن موضوع txt واستخدام افضل طريقه فعل هذه الطريقه تخدم , وامر اخر ليس لدي خبره في ال vc++.net لا تنسى ,و يعني على مهلكم علي :(

تم تعديل هذه المشاركة بواسطة ( HASSAN ) في 2 يوليو 2011 في 18:55

#7

تابع

تم تعديل هذه المشاركة بواسطة ( HASSAN ) في 2 يوليو 2011 في 09:07

#8

اتوقع البعض لم تصله المشكله ساضعها لكم على شكل رسم توضيحي :-

post-168424-036578000 1309618382_thumb.p

المرفقات
Untitled.png

تم تعديل هذه المشاركة بواسطة ( HASSAN ) في 2 يوليو 2011 في 17:53

#9

تم التعديل

تم تعديل هذه المشاركة بواسطة ( HASSAN ) في 2 يوليو 2011 في 19:15

#10

هذه طريقه سهله:

إبحث عن طريقه لتنفيذ native code داخل بيئة الدوتنيت (يوجد في الجافا ما يسمى ب JNI لعمل ذلك .. لذا اكيد الوضع أسهل في الدوتنيت) ... و من ثم قم بترجمة الملف المصدري ل object file (ربما dll أو lib) و قم بإستخدامه من داخل برنامجك ك API ...

#11

على ما اعتقد لو انك تريد استدعاء ملفات exe فانه يمكنك استدعاءها على شكل process

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#12

ممكن تضع برنامج الـexe مع توضيح للبراميترز الممررة ؟

1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13

كما قلت لكم يا اخوان البرميترز هي عباره عن ملفات تكست وكذالك المخرجات تكون ملفات تكست .. المطلوب تحوير برنامج الكونسول حتى يتعامل داخليا .. او كمكتبه مثل ما قال الاخ هويدي لكن لا نريده ان يستعمل التيكست وانما الكرد مباشرة او مصفوفة هذا يساعد في السرعة للبرنامج لانه مطلوب تشغيل الكونسول لا2000 مرة تقريبا .. يعني بالنتيجة يكون الكونسول داخلي مع البرنامج الاب ولا يكون كملف تنفيذي خارجي وبذلك نكسب الوقت

#14

اذا كان عندك السورس كود لل exe

1- قم بعمل export لل functions التي تحتاجها ثم قم بأستدعاها من خلال ال InteropServices

طريقه ثانيه

استعمل ال

C++.Net لانك لن تحتاج الا لعمل wrapper وستحافظ على نفس الكود دون اي عناء يذكر

1
#15

رح أعطيك الحل

اولا تقوم بعمل البرنامج اللي على C++ على شغل DLL

بعدها تستدعيه من الفيجوال بيسك وتقوم باستخدام الدوال عادي

والسلام عليكم

1
#16

السلام عليكم ورحمة الله وبركاته

بداية من إطار العمل 3.5 تم دعم مجال الأسماء System.IO.Pipes والذى يوفر عليك عناء استخدام دوال الـAPI

الذى يفيدك فى هذه الحالة هو استخدام الفئتين NamedPipeServerStream , NamedPipeClientStream ويمكنك مشاركة البيانات بينهما بكل سهولة

الفكرة باختصار تتلخص كالآتى:

1- إنشاء وتهيئة نسخة من الفئة NamedPipeServerStream ويتم إرسال معاملين فى حالتك هذه هما إسم الـPipe - الاتجاه In-Out-InOut وهذا سيكون فى برنامج الخادم والذى يتمثل فى برنامج الكونسول

2- ينتظر الخادم الاتصال القادم من الكلاينت

3- يدخل الخادم فى حلقة تكرارية بحيث ينتظر وصول البيانات من الكلاينت ثم يقوم بمعالجتها

4- يقوم الخادم بإرسال نتيجة معالجة البيانات مرة أخرى إلى الكلاينت

أرفقت لك مثالا بسيطا عبارة عن برنامج شات بواجهة كونسول يتكون من Server , Client

ملحوظة عند تجربة المثال المرفق:

كل برنامج يرسل رسالة واحدة فقط ثم ينتظر الرد أى أنه لا يمكن إرسال رسالة أخرى حتى يتم الرد على الرسالة السابقة

المثال مكتوب باستخدام VS 2010 Ultimate (VB.NET)

PipesSample.rar

3

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#17

جوست ...

ما رأيك في فكرة إستدعاء كود ال سي من داخل الدوتنيت بإستخدام InteropServices؟

و أيهما تفضل - و بخاصه في الأداء؟ إستخدام Pips (و بالتالى جعل process تتخاطب مع process أخرى. أليس كذلك؟) .. أم إستدعاء كود native من داخل DLL ؟

(بصراحة أحب جدا السي شارب ... لالطريقة الغريبه التى يستخدمون بها السي شارب.. لكنت حولت لها من زماااان)

1
#18

يمكن استدعاء الدوال الموجودة داخل مكتبة API بكل سهولة داخل الدوت نت باستخدام المواصفة DllImportAttribute

أما بالنسبة للأداء فى رأيى الشخصى لا أرى أن هناك أى فرق فى الأداء وإن وُجد فسيكون الفرق ضئيل جدا لأن إطار العمل هو أصلا عبارة عن wrapper لدوال الـAPI ولو راجعت مجال الأسماء System.IO.Pipes باستخدام برنامج Reflector ستجد أنه يستدعى هذه الدوال مباشرة بعد تهيئة المعاملات اللازمة

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#19

شوفوا يا شباب هوه كان الكونسول شغال وبيعمل ومفيش مشكله الا انه انا بستدعيه كثير اثناء عمل البرنامج يعني نسبه وتناسب مع البرنامج اللي عندي بيكون بطيء نوعا ما .. لهيك الطريقه الجديده المفروض تكون اسرع بحيث نستغني عن ال I/O وده اللي عمله اخونا GM جزاه الله كل خير .. لهيك فاضل عملية الربط واللي بصراحه ما اشتغلتهاش من قبل خالص :D

مواضيع مشابهة