صفحه 1 از 2

چند سؤال در مورد ويژوال بسيک

ارسال شده: پنج‌شنبه ۹ فروردین ۱۳۸۶, ۲:۴۴ ب.ظ
توسط pc-sinoheh
1. چطوري ميشه تو ويژوال بسيک فايل هاي اجرايي(exe) رو اجرا کرد
2.چطوري ميشه يک فايل رو hideبه صورت سيستمي)کرد)
3.کارکرد TrayIcon Ctrlچطوريه
4.چطوري CD RW رو باز کرد
ممنون ميشم جواب بديد
چند سؤال ديگه دارم که بعدن تو اين تايپک ميزارم
thankful :)

Re: چند سؤال در مورد ويژوال بسيک

ارسال شده: یک‌شنبه ۱۲ فروردین ۱۳۸۶, ۵:۵۷ ب.ظ
توسط athlon64x2
سلام دوست عزيز و گرامي

من با فرض اينکه منظور شما vb.net هست پاسخ ميدم . اگر منظورتون vb6 بوده بفرماييد تا اشتباهم رو اصلاح کنم و پاسخ مرتبط با اون نسخه رو ارسال کنم.

pc-sinoheh نوشته شده:1. چطوري ميشه تو ويژوال بسيک فايل هاي اجرايي(exe) رو اجرا کرد


راههاي بسيار زيادي براي اينکار وجود داره که بستگي به جزيياتي داره که ميخواهيد کنترل کنيد. آيا صرفا ميخواهيد برنامه رو اجرا کنيد يا سطوح دسترسي خاص يا اکانت ديگري براي اجرا مد نظرتونه ي ... . اسونترين روش shell هست .
Please Login or Register to see this code

2.چطوري ميشه يک فايل رو hideبه صورت سيستمي)کرد)


منظورتون hide کردن يک فايل روي ديسک و دادن خصلت سيستمي به اون هست ؟
Please Login or Register to see this code

اما اين عبارت "سيستمي کردن" در کنار بقيه سوالات شما سبب ميشه که برداشت من چنين باشه که هدف شما نوشتن برنامه اي است که در system tray قرار بگيره و عملکردش رو از طريق لود کردن و اجرا نمودن يکسري exe انجام بده و هدفتون مخفي ماندن آن پروسه ها است به شکلي که کاربر احساسي از لود شدن يوتيليتي ها در پشت برنامه نداشته باشه . البته تابع SetSystemProcess که باعث شده بود اين عبارت مصطلح بشه فقط تحت ويندوز خانواده 9x جواب ميده و در nt کاربرد نداره و در واقع نام اشتباهي است که به اين کار اطلاق ميشه. اگر قصدتون نشون ندادن title برنامه بصورت در task panel هست ميشه کارهايي انجام داد اما اگر هدفتون حذف نام برنامه از ليست task manager باشه بطور کلي پاسخ شما منفي است و روشهاي موجود هم باعث ميشن کد شما بعنوان ويروس شناسايي بشه . اصولا مخفي کردن برنامه از Task manager همونطور که در پست ديگري نيز ذکر کردم يکي از بدترين نمونه هاي bad programming هست چرا که امکان وجود باگ هميشه هست و حالات پيش بيني نشده (مثل اشکالات نرم افزاري کامپيوتر قرباني يا ناسازگاري با dll هاي ورژن هاي بعدي و ...) زياد پيش مياد و اينکار شما امکان حذف پروسه گناهکار رو بدون ريست سخت افزاري غير ممکن ميکنه.

3.کارکرد TrayIcon Ctrlچطوريه


اينکه چطوري کار ميکنه پيچيده نيست مثل اغلب کنترل هاي دات نت يک کلاس با طراحي عالي است که عملکرد shell notify رو encapsulate ميکنه. نيازي به استفاده از کنترل third party نداريد و NotifyControl در مجموعه ويژوال استوديو 2005 وجود داره و نصب ميشه . اگر هم منظورتون نمونه کد نحوه استفاده از آن هست ميتونيد اين آدرس رو مشاهده فرماييد.
[External Link Removed for Guests]).aspx

4.چطوري CD RW رو باز کرد


چندين روش براي رايت سي دي هست. اگر بخواهيد کد بنويسيد سر راست ترين راه که سطح مناسبي از کنترل شما رو فراهم ميکنه استفاده از cd burner خود ويندوز (از xp به بعد) از طريق اينترفيس imapi است فقط عيبش اينه که دي وي دي رايت نميکنه . البته راههاي ديگه مثل استفاده از کنترلهايي که براي اينکار توسط شرکتهاي ديگه تهيه شده يا استفاده از nero sdk يا حتي استفاده از aspi dll نيز وجود داره که اين يکي معمولا مورد استفاده نرم افزارهاي تخصصي رايت قرار ميگيره. اگر imapi کافي باشه براي کارشما خوشبختانه.net wrapper وجود داره لطفا آدرس زير رو ببينيد
[External Link Removed for Guests]

روش ديگه استفاده از يوتيليتي هاي خارجي است. شخصا از اين روش زياد استفاده کرده و ميکنم و کاملا هم جواب ميده . براي اينکار نياز به يک يوتيليتي براي ساختن iso image و يکي براي رايت اون داريد . براي اولي از mkisofs و براي رايت سي دي يا دي وي دي از cdrecord استفاده کنيد که هردو در پکيج cdrtools قرار دارند که جزيي از gnu project هست و اوپن سورس نيز هستن. البته magiciso رو هم ميشه استفاده کرد که مجاني نيست . براي cdrtools لطفا آدرس زير رو ملاحظه بفرماييد
[External Link Removed for Guests]
dll هاي مورد نياز
[External Link Removed for Guests]

اميدوارم در حل مشکل شما کمک کننده باشه .

ارادتمند
نعيمي

ارسال شده: دوشنبه ۱۳ فروردین ۱۳۸۶, ۱:۱۹ ب.ظ
توسط pc-sinoheh
از شما ممنونم به خاطر جواب شما
منظورم ويژوال بسيک 6 هستش
ولي انگار کدها مشکل دارن :razz:
لطفا يک نگاهي کنيد :razz:

ارسال شده: دوشنبه ۱۳ فروردین ۱۳۸۶, ۳:۲۷ ب.ظ
توسط athlon64x2
pc-sinoheh نوشته شده:از شما ممنونم به خاطر جواب شما
منظورم ويژوال بسيک 6 هستش
ولي انگار کدها مشکل دارن :razz:
لطفا يک نگاهي کنيد :razz:


سلام دوست خوبم
ممنونم از لطف شما . در مورد مشکل کد ها که فرموديد مشخصا و در ابتداي پستم ذکر کرده بودم

athlon64x2 نوشته شده:من با فرض اينکه منظور شما vb.net هست پاسخ ميدم . اگر منظورتون vb6 بوده بفرماييد تا اشتباهم رو اصلاح کنم و پاسخ مرتبط با اون نسخه رو ارسال کنم.


کدهاي پست قبلي همانطور که ذکر آن رفت مربوط به vb.net هست و دليل کار نکردن اونها در vb6 هم به اين دليله . البته شايد بهتر بود پيش از پاسخ دادن منتظر پاسخ شما در مورد نوع vb مورد استفاده ميبودم. خوب من فقط تفاوت هايي رو که بايد مد نظر قرار بدين ذکر ميکنم و بقيه مطالب پست قبل صادق خواهد بود

1. چطوري ميشه تو ويژوال بسيک فايل هاي اجرايي(exe) رو اجرا کرد


مطالب پست قبلي صادقه فقط دستور shell در vb6 امکانات واقعا کمي داره که البته بيشتر مواقع جوابگو است .چند روش ديگه هم وجود داره مثل استفاده از windows shell و createprocess که البته جزو win32 api هستند.
Please Login or Register to see this code

2.چطوري ميشه يک فايل رو hideبه صورت سيستمي)کرد)


دوست خوبم نفرموديد هدفتون hide and system نمودن يک فايل است يا اجراي يک برنامه در حالت hidden . در مورد دومي توضيحات پست قبل صدق ميکنه اما براي تغيير attribute فايل در vb6 از کد زير استفاده کنيد
Please Login or Register to see this code

3.کارکرد TrayIcon Ctrlچطوري


من شخصا با اين کنترل کار نکردم و بنابراين نميتونم نظر بدم و بطور کلي مطالب پست قبلي صدق ميکنه . البته درست کردن syatray icon اونقدر کار اسوني هست که نياز به کنترل نداشته باشه چون عمده کار عملياتي است که در callback ها انجام ميدين . اگر هم منظورتون نحوه طراحي است مطالب پست قبلي مصداق داره فقط به سادگي آدرس يک function رو به عنوان callback به shell notify ميدين و بسيار سر راست هست.

4.چطوري CD RW رو باز کرد


راستش خبر ندارم که imapi wrapper براي vb اومده يا خير ميتونيد جستجو کنيد. اگر هم نباشه قاعدتا مجبوريد wrapper class رو خودتون بنويسيد که چندان هم سخت و پيچيده نيست و طبق معمول کد سي رو بازنويسي ميکنيد . اما توصيه من استفاده از يوتيليتي هاي مجموعه cdrtools براي ساختن iso و سپس burn کردن اون هست و لطفا مطالب پست قبلي رو براي توضيح مفصلتر ملاحظه بفرماييد.

توصيه ميکنم اگر محدوديتي پيش رو نداريد vb6 رو کنار بگذاريد . vb.net اولين پياده سازي از vb است که ميشه به اون زبان برنامه نويسي کامل اطلاق کرد. vb کلاسيک فقط مناسب توليد برنامه هايي است عمدتا مبتني بر UI و بدون عملکرد پيچيده يا زمانبر. البته اگر هدفتون نوشتن يک shell براي اجراي ساير يوتيليتي ها است شايد بد نباشه اما هميشه مد نظر داشته باشيد که vb کلاسيک در 20% کارها developer enemy است و 5% کارها هم توسط آن غير ممکن هست . هميشه محدوديت ها رو در کنار سرعت پيشرفت کار مد نظر داشته باشيد و بجاي کشتي گرفتن با محدوديت ها و خوروندن کد بازنويسي شده سي به بيسيک وقت و انرژي ارزشمندتون رو صرف طراحي خوب الگوريتم و پياده سازي ساختارمند کنيد. اگر ide خوب بيسيک ويرايش راحت کد و exe سبک (عدم نياز به .net platform) سبب اين انتخاب شماست c++ builder رو ميتونيد مد نظر داشته باشيد که ساختار کامل سي++ رو با سادگي ide ويژوال بيسيک در آميخته .

ارادتمند شما
نعيمي

ارسال شده: سه‌شنبه ۱۴ فروردین ۱۳۸۶, ۳:۵۴ ب.ظ
توسط pc-sinoheh
مي بخشي يک سؤال ديگه آيا ميشه برنامه که در حال اجرا هستش از روي Hard disk پاک بشه
(منظورم اينه که برنامه ي درست کردم بعد از اجرا پاک بشه)
آيا اين ممکن هستش
:razz:

ارسال شده: سه‌شنبه ۱۴ فروردین ۱۳۸۶, ۷:۰۶ ب.ظ
توسط athlon64x2
pc-sinoheh نوشته شده:مي بخشي يک سؤال ديگه آيا ميشه برنامه که در حال اجرا هستش از روي Hard disk پاک بشه
(منظورم اينه که برنامه ي درست کردم بعد از اجرا پاک بشه)
آيا اين ممکن هستش
:razz:


سلام دوست خوبم

اينکه يک فايل بعنوان آخرين دستور قبل از End خودش رو پاک کنه خير غير ممکنه و فايل lock شده هست و unlock و ... هم نميشه . اما اين سوال شما يکي از شايع ترين سوالهايي است که با اون برخورد ميکنم. براي حل اين مشکل ترفند هايي وجود داره که البته بسته با پاسخ شما به همون سوالي داره که در انتها ازتون خواهم پرسيد .

1. روش معمول: در رجيستري برنامتون رو براي حذف در بوت بعدي رجيستر ميکنيد (زير run يک مدخل به نام runonce هست) و بعد يک ديالوگ به کاربر نشون ميديد که کامپيوتر بايد ريبوت بشه و حتما فرصت کافي بديد تا بقيه کارهاش رو انجام بده و احيانا اگر در برنامه ديگه اي مشغول به کاره اطلاعات رو سيو کنه (مشابه ديالوگ بعد از نصب ورژن جديد درايور سخت افزاري مثلا) با اينکار در ريبوت برنامه پاک ميشه . اين روشي است که برنامه uninstaller خيلي بکار ميبرن و uninstaller ويندوز و install shield هم تقريبا مشابه همين عمل ميکنند (البته بجاي رجيستري يک ديتا فايل در کنار uninstaller قرار ميدن که هر بار سيستم بوت ميشه اتوماتيک چک ميشه) .به نظر ميرسه بيشتر برنامه هايي که با آگاه سازي کاربر از اصل ماجرا مشکل ندارن اين روش رو بکار ميبرن . سرراست و بدون ريسک و البته اخلاقي است.

2. روش مرسوم ترويان و کرم نويس ها: اين روشها به شدت مورد استفاده برنامه هاي موسوم به worm قرار ميگيره که اطلاعاتي رو جمع آوري و ارسال ميکنند و پس از اون ردپاشون رو پاک ميکنن . يک برنامه اجرايي کوچک مختص حذف برنامه درون برنامه اصلي قرار مگيره و موقع اجرا در يک فولدر که دم دست نباشه کپي ميشه (مثلا temp يا اخيرا خود windows مشابه با ويروسهاي اسکريپت در وب پيج ها) . حتي ميشه پسوندي غير از exe داشته باشه . بصورت non wait & async در انتهاي برنامه اجراش ميشه و ليست پروسه هاي در حال اجرا رو poll ميکنه و به محض unload شدن برنامه اصلي حذفش ميکنه . اين فايل زايد هم معمولا جا ميمونه يا ميشه با روش ايتم قبلي پاکش کرد و ... در مورد نمونه کد اين روش و توضيحات دقيقتر شرمنده هستم چراکه مغاير با قوانين سايت و باورهاي خودم هست .

3 و 4 روش ويروس نويس ها که در بيسيک به راحتي قابل انجام نيستند.

دوست خوبم با شناختي که از شما دارم مطمئن هستم هدف مثبتي داريد بنابراين اگر تصوير بهتري از برنامه نهايي بهم بديد شايد بهتر بتونم کمک کنم.

ارادتمند
نعيمي

ارسال شده: پنج‌شنبه ۱۶ فروردین ۱۳۸۶, ۵:۲۶ ب.ظ
توسط pc-sinoheh
ميبخشيد منضورم اينه که برنامه فقط يک بار قابل استفاده با شه(يک بار اجرا بشه بعدن پاک بشه)
ولي اين موردي که گفتيد امکان داره که بعد از زيست پاک بشه :razz:

ارسال شده: جمعه ۱۷ فروردین ۱۳۸۶, ۶:۱۵ ق.ظ
توسط athlon64x2
pc-sinoheh نوشته شده:ميبخشيد منضورم اينه که برنامه فقط يک بار قابل استفاده با شه(يک بار اجرا بشه بعدن پاک بشه)
ولي اين موردي که گفتيد امکان داره که بعد از زيست پاک بشه :razz:


سلام دوست خوبم
خير چرا پاک بشه ؟
شما فقط بعد از اين که برنامه يکبار با موفقيت کارهاي لازم رو به پايان رسوند (successful exist) قبل از پايان برنامه (همون محل End واقعي يا فرضي) همون محلي که برنامه ختم ميشه معمولا آخر main يا در form_unload اگر در event ها فرم ها کد نويسي کرديد در رجيستري در runonce دستور حذف فايل رو اضافه کنيد. بالطبع حتي ميتونيد يک متغير در برنامه داشته باشيد که اگر هر خطايي رخ داد true بشه و در اينصورت در اين تابع پاياني چک کنيد و اگر خطايي رخ داده اين يک خط رو به رجيستري اضافه نکنيد . حتي ميتونيد يک شمارنده در رجيستري بگذاريد که برنامه فقط n بار مشخص اجرا شه و بعد از اون حتي با اينکه پاک نشده اما وقتي اجراش کنن کار خاصي انجام نده و خارج بشه. کافيه ابتداي برنامه اين خونه رجيستري رو نگاه کنيد و پايان برنامه مقدارش رو يکي زياد کنيد يا هر طراحي ديگه اي . همه چيز دست خودتونه.

ارادتمند
نعيمي

ارسال شده: جمعه ۱۷ فروردین ۱۳۸۶, ۷:۴۳ ق.ظ
توسط Dr.XJ
pc-sinoheh, عزیز
بنده در ادامه فرمایش آقای نعیمی عرض کنم یک راه بسیار آسان دیگر نیز برای اینکار موجود است
استفاده از Batch فایل

کد بسیار ساده و ابتدایی زیر این کار را انجام میدهد و بعد از اجرا و در هنگام خروج یک فایل Batch میسازد و آن را اجرا میکند
فایل Batch هم هم برنامه و هم خود را پاک میکند
به همین راحتی :grin:

[align=left]
Please Login or Register to see this code
 

ارسال شده: دوشنبه ۲۰ فروردین ۱۳۸۶, ۱۱:۴۶ ب.ظ
توسط moho_bp
در جواب pc-sinoheh
برای اجرای یک فایل EXE از داخل VB .
shell(بصورت استرینگ آدرس کامل فایل را بده)

برای Hiden کردن فایل.
Getattr(ابتدا نام فایل بصورت استرینگ,سپس عدد 34 را وارد کنید)

ارسال شده: سه‌شنبه ۲۱ فروردین ۱۳۸۶, ۷:۳۹ ق.ظ
توسط athlon64x2
moho_bp نوشته شده:در جواب pc-sinoheh
برای اجرای یک فایل EXE از داخل VB .
shell(بصورت استرینگ آدرس کامل فایل را بده)

برای Hiden کردن فایل.
Getattr(ابتدا نام فایل بصورت استرینگ,سپس عدد 34 را وارد کنید)


سلام دوست بسيار عزيز و گرامي

ورودتون رو به سايت سنترال کلوپ خوشامد ميگم و آرزو ميکنم لحظات خوشي رو در کنار ساير دوستان اين جمع صميمي داشته باشيد
از مطلبتون سپاسگزارم و اميدوارم شاهدمطالب خوب و ارزشمند شما در انجمن باشيم و مطالب جديد از شما بياموزيم

فقط دو سه نکته کوچک به نظر من رسيد که ممنون ميشم نظر شما رو هم در موردش بدونم

يکي در مورد مخفي کردن فايل که فکر ميکنم منظور شما نيز SetAttr بوده چراکه عملکرد دو تابع SetAttr , GetAttr بر اساس اختلاف نام آنها مشخصه.

دوم در مورد مقدار ثابتي است که فرموديد عدد 34 به عنوان پارامتر دوم رد بشه . عدد 34 در واقع مقداري جادويي نيست . در واقع جدول مقادير ثابت در ويژوال بيسيک 34 معادل زير خواهد بود
vbArchive = 32 , vbSystem = 2 که vbArchive | vbSystem = 34 خواهد بود . اولا نيازي به دادن خصلت آرشيوي به فايل نيست . اين خصلت زماني مورد استفاده قرار ميگيره که ميخواهيد روي محتويات يک فولدر پروسه اي انجام بديد (مثلا بک آپ گيري) و ميخواهيد به نحوي فايلهايي که پروسه اي روي آنها صورت گرفته علامت بزنيد اين در بچ نويسي که آرايه و. .. نداريم خيلي کمک کننده و لازم هست . در واقع صرفا به شکل يک چک مارک بهش نگاه کنيد که ميخواهيد پشت اسم يک فايل به هر دليلي در يک ليست تيک بزنيد و استفاده ديگه اي نداره . به نظر من نوشته
SetAttr "filename", vbHidden خيلي مفهوم تر از نوشتن SetAttr "filename", 2 هست

نکته سوم در مورد وارد کردن مقدار ثابت بصورت عدد بجاي constant name هاي اون هست که چندين مشکل ايجاد ميکنه. يکي نامشخص بودن و عملا غير ممکن کردن ديباگ . فرض کنيد کد شما فايل رو مخفي نکنه در اينصورت کي ميتونه خط کد اشتباه رو پيدا کنه ؟ کد بسيار نامفهومه . ثانيا ميکروسافت ثبات نامها رو گارانتي کرده ولي ثبات مقادير رو خير . بعنوان مثال کد شما ممکنه در vb6sp1 که کمپايل بشه يک عملکرد داشته باشه و با sp2 عملکردش تغيير کنه . البته معمولا اين اتفاق نميفته اما به نظر من شايد بهتر باشه کدمون رو مستعد چنين خطاهايي نکنيم و از قواعد طراح زبان برنامه نويسي و توصيه هاي اون پيروي کنيم تا کد ما در آينده هم با عملکرد تضمين شده و مشابه قبل کمپايل بشه و هم تبديل اون به زبانهاي ديگه در صورت لزوم راحت تر صورت بگيره .

نظر شخصي من اينه که اصولا کد خوب کدي است که فرد دوم با اولين نگاه 1. متوجه ساختار 2. متوجه الگوريتم 3. متوجه عملکرد کلي هر تابع بشه و در ديباگ عملکرد هر خط کد مفهوم و قابل تست شدن باشه . چنين برنامه اي از لحاظ حرفه اي بعنوان يک نرم افزار قابل انتشار و پشتيباني از طرف تيم توليد يا پشتيباني در نظر گرفته ميشه و به نظرم بهتره هميشه سعي کنيم در برنامه نويسي به team work فکر کنيم .

همونطور که گفتم اينها نظرات من هستند و خيلي دوست دارم نظر شما رو هم بدونم . البته اينو هم بگم که خيلي از موارد در کد نويسي نيز سليقه اي و يا عادتي هستند
منتظر پست هاي خوب شما و نظرات ارزشمند شما هستم

ارادتمند
نعيمي

ارسال شده: یک‌شنبه ۲ اردیبهشت ۱۳۸۶, ۴:۲۶ ب.ظ
توسط pc-sinoheh
مي بخشيد در بالا آقاي نعيمي گفتن(از طريق رجيستري ميشه يك برنامه رو از بوت خارج كرد)
ميشه توضيح بديد :razz:
من نمي تونم با توابع رجيستري كار كنم ميشه كمك كنيد(اگه از توابع رجيستري مثال بزنيد ممنون ميشم)
ممنون :razz: :AA: