گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
ممنون استاد علی
بله
با =+ این کار رو میکنم . از resharper هم استفاده نمیکنم . ولی توی اینتل لایسنس اون دلیگیت WMPLib._WMPOCXEvents_PlayStateChangeEventHandler را وقتی مینویسم ، نمیاره





کدم واسه اتوپلی هست . اونجا مشکلی نیست .
کلا این کد سی شارپ هست :


کد:
    public class WMPlayer
    {
        public static WindowsMediaPlayer wmp;


        [DllExport("PlaySound", CallingConvention.StdCall)]
        public static void PlaySound(string filePath)
        {
            WMPlayer.wmp = new WindowsMediaPlayer();
            WMPlayer.wmp.URL = filePath;
            WMPlayer.wmp.controls.play();
        }

        [DllExport("SetPos", CallingConvention.StdCall)]
        public static void SetPos(double forward)
        {
            WMPlayer.wmp.controls.currentPosition = WMPlayer.wmp.controls.currentPosition + forward;
        }
    }

حالا کلاس دیگه ای هم درون این فضای نام (کنار این کلاس) هست
و کد اتوپلی هم :


کد:
hDll = Library.Load("AMS_CS.dll", false);
if(hDll == nil) then
return;
end

hDll.SetPos(10);

hDll:Close_();

البته بعد از لود آهنگ یعنی بعد از کد زیر که در دکمه ی دیگه هست ، کد بالا را استفاده میکنم :


کد:
hDll = Library.Load("AMS_CS.dll", false);
if(hDll == nil) then
return;
end

soundFilePath = [[E:\Mp3\Mp3\CD 1\Hamed Zamani\1\Khabari Hast (128).mp3]];
hDll.PlaySound(soundFilePath);

hDll:Close_();
اتوپلی همیشه مقدار double با پارامتر های عددی ارسال می کنه یا کلا اونقدر هوشمندانه طراحی شده که میفهمه اون 10 باید double باشه؟ چون طبیعیه که اگر مقدار Int رو داخل پارامتر double ارسال کنه نتیجه مطلوبی نخواهید گرفت.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اتوپلی همیشه مقدار double با پارامتر های عددی ارسال می کنه یا کلا اونقدر هوشمندانه طراحی شده که میفهمه اون 10 باید double باشه؟ چون طبیعیه که اگر مقدار Int رو داخل پارامتر double ارسال کنه نتیجه مطلوبی نخواهید گرفت.

:)
ممنون
نه تا حالا با نوع داده ای int (در سی شارپ) با اتوپلی و لوا کار میکردم
مشکل از همین نوع داده ای double ای بود که گذاشتم
اما نوع داده ای همه ی اعداد در لوا double هست :

Lua Data Types

پس چرا با نوع double مشکل داره و با نوع int در سی شارپ ، مشکل نداره؟ سایز double شون مگه فرق داره؟
یه سئوال دیگه هم اینکه اصلا چرا آرایه رو مستقیما از لوا به سی شارپ نمیشه فرستاد؟ ممکنه بخاطر این باشه که آرایه در لوا ، در واقع آرایه ای از اشاره گر هه؟ (چون هر نوعی در هر عضو داده ای اش میشه ریخت شبیه object) . بعد هم سی شارپ نمیدونه هر کدوم از اعضای آرایه ی لوا (که احتمالا باید اشاره گر باشن) ، از چه نوع داده ای هستن تا سایزش برای خوندن اون مقدار ، براش مشخص بشه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
:)
ممنون
نه تا حالا با نوع داده ای int (در سی شارپ) با اتوپلی و لوا کار میکردم
مشکل از همین نوع داده ای double ای بود که گذاشتم
اما نوع داده ای همه ی اعداد در لوا double هست :

چیکار به لوا دارید، لوا که تابع رو فراخوانی نمی کنه، Library می کنه که جزئی از اتوپلی ئه، هر قابلیتی برای فراخوانی متد از کتابخانه باشه و نباشه مربوط به Library ئه. لوا خودش که با DLL ها کاری نداره.
پس چرا با نوع double مشکل داره و با نوع int در سی شارپ ، مشکل نداره؟ سایز double شون مگه فرق داره؟

یعنی چی؟ مگه سایز یکسان باشه کافیه؟ محتویات دو جور داده کاملا متفاوت رو که نمیشه بجای هم استفاده کرد. در حافظه بشکل کاملا متفاوتی ذخیره و تفسیر میشن. داده اعشاری ممیز شناور کجا، داده صحیح کجا.
یه سئوال دیگه هم اینکه اصلا چرا آرایه رو مستقیما از لوا به سی شارپ نمیشه فرستاد؟ ممکنه بخاطر این باشه که آرایه در لوا ، در واقع آرایه ای از اشاره گر هه؟ (چون هر نوعی در هر عضو داده ای اش میشه ریخت شبیه object) .
از لوا مستقیم به هیچ زبان و محیط دیگری نمیشه داده فرستاد، چه آرایه و چه غیر آرایه، از خودتون اصول اختراع نکنید. اون موجودیتی که داده به متد در کتابخانه #C یا هر جای دیگری ارسال میکنه Library یا هر پلاگین دیگری ئه که در اتوپلی بکار میره. این پلاگین هم به هر حال با Stdcall سر و کار داره. فقط هم محدودیت این پلاگین ها نیست، کلا در فراخوانی متد و ارسال پارامتر اشاره گر ها باید در حافظه قابل دسترسی باشند، حافظه Private داخل پروسه که قابل دسترسی کتابخانه نیست. در Stdcall یا داده ساده و generic ئه که مقدارش ارسال میشه یا آرایه و ساختار ئه که اشاره گر اش ارسال میشه. و اشاره گر هم باید به حافظه ای اشاره کنه که قابل دسترسی کتابخانه و Global باشه، برای همین باید اول برایش یک حافظه ایجاد کنید. نه فقط لوا، هر زبان دیگری، موقع ارسال آرایه به متد داخل کتابخانه اشاره گر ارسال میشه.
اینکه دریافت کننده اشاره گر چطور تفسیرش کنه یک قضیه جداست، ارسال انجام میشه، اما اینکه چطور با اشاره گر به اشیاء دسترسی داشته باشید به کدی که می نویسید بستگی داره، محدودیت فنی ای در کار نیست.
بعد هم سی شارپ نمیدونه هر کدوم از اعضای آرایه ی لوا (که احتمالا باید اشاره گر باشن) ، از چه نوع داده ای هستن تا سایزش برای خوندن اون مقدار ، براش مشخص بشه؟
نه فقط #C، در هیچ زبانی همچین اطلاعاتی وجود نداره که بگه فرستنده چه چیزی رو با چه نیتی فرستاده، شما یک مقدار رو به عنوان پارامتر ارسال می کنید، یکسری بایت ئه، نه معلومه داده عددی ئه، اشاره گر ئه، از چه نوعیه و ...
در خیلی از متد ها دو تا پارامتر ئه، 1- اشاره گر آرایه و 2- طول آرایه، چون صرفا با اشاره گر نمیشه طول آرایه رو فهمید، به عنوان یک پارامتر جداگانه مشخص اش می کنند.
اگر قراره داده انواع و طول های متفاوتی داشته باشه بهتره با پارامتر های دیگری نوع و طول رو مشخص کنید. مثل نوع داده Variant :
Variant type
در ویژوال بیسیک کلاسیک مثل object عمل میکرد، که پیاده سازی کاملش به کد نویسی زیادی احتیاج داره :
VARIANT structure
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
میگم من که آخر متوجه نشدم این پردازنده ی کارت گرافیک ، چه اوقاتی به کار گرفته میشه در برنامه ها . تا قبلا میگفتن توی پروژه های wpf که از directx استفاده میکنن ، بکار گرفته میشه اما توی پروژه ی گرافیکی ای (پروژه ی paint) که با win form نوشتم (که از gdi+ استفاده میکنه) ، هم انگار مورد استفاده قرار میگیره (کارتم GTX 750 هه)
ولی چرا در این پروژه (paint) ، پردازنده ی گرافیکی را باز تا 20 درصد مشغول میکنه حداکثر؟ (چون این پروژه همون کدی که قبلا برای براش داده بودین را داره و اگه تند رسم کنم ، فاصله میندازه بین براش ها) بنابراین اگه پردازنده ی گرافیکی تا آخر استفاده بشه (100 در 100 اش) ، فاصله ی بین براش ها باید کمتر بشه دیگه؟ و روان تر بشه دیگه؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
میگم من که آخر متوجه نشدم این پردازنده ی کارت گرافیک ، چه اوقاتی به کار گرفته میشه در برنامه ها . تا قبلا میگفتن توی پروژه های wpf که از directx استفاده میکنن ، بکار گرفته میشه اما توی پروژه ی گرافیکی ای (پروژه ی paint) که با win form نوشتم (که از gdi+ استفاده میکنه) ، هم انگار مورد استفاده قرار میگیره (کارتم GTX 750 هه)
ولی چرا در این پروژه (paint) ، پردازنده ی گرافیکی را باز تا 20 درصد مشغول میکنه حداکثر؟ (چون این پروژه همون کدی که قبلا برای براش داده بودین را داره و اگه تند رسم کنم ، فاصله میندازه بین براش ها) بنابراین اگه پردازنده ی گرافیکی تا آخر استفاده بشه (100 در 100 اش) ، فاصله ی بین براش ها باید کمتر بشه دیگه؟ و روان تر بشه دیگه؟
باز که برگشتید سر خونه اول، شما چند تا فرض اولیه در سوالتون دارید. اول اینکه پردازنده کارت گرافیکی در کدتون مورد استفاده قرار میگیره. دوم اینکه حداکثر 20 درصد توانش رو بکار میگیره. سوم اینکه میتوانست تمام توانش رو بکار بگیره. چهارم اینکه افزایش توانش باعث کاهش فاصله بین براش ها میشه.
اولا کارت گرافیکی رو اگه از مدار خارج کنید چیزی رو صفحه نمایشگر نشون نمیده، پس اینکه بگید چه اوقاتی بکار گرفته میشه ربطی به برنامه ها و کد شما نداره، هر لحظه در حال استفاده است. و بخش قابل توجهی از عملیات های ساده گرافیکی که سیستم عامل به برنامه ها ارائه می کنه، توسط کارت گرافیکی بصورت سخت افزاری در درایورش پیشتیبانی میشه، به همین جهت لزومی نداره که شما در کدتون کار خاصی انجام داده باشید، پردازنده کارت گرافیکی در همون عملیات های ساده گرافیکی GDI و +GDI هم ممکنه نقش داشته باشه که مربوط به کد درایورشه.
ثانیا شما مگر برای کدی که داخل برنامه تون در رسم گرافیکی می نویسید 100 توان پردازنده رو بکار میبرید که حالا برای پردازنده کارت گرافیکی هم 100 درصد توان رو انتظار دارید؟ مثال ساده ای بزنم، شما کدی می نویسید که نرخ رسمش 10 براش در ثانیه است، کندی اش هم مربوط به روال رسم خود پردازنده است، رسم گرافیکی براش رو هم می سپارید به پردازنده گرافیکی که میتونه در هر ثانیه 1000 تا براش رسم کنه. نرخ رسم همچنان 10 براش در ثانیه میمونه. این کارت گرافیکی رو با یک کارت گرافیکی دیگه که صد بار سریعتره هم عوض کنید فرقی نمی کنه. چون شما به هر حال هر ثانیه 10 تا براش رسم می کنید، هیچوقت هم کل توان پردازنده گرافیکی رو بکار نمی برید. در ضمن هیچ تصوری هم از توان کامل پردازنده گرافیکی ندارید، مثل همون قضیه هسته مجازی ئه که شما تا وقتی ندونید اون هسته های مجازی چطور کار می کنه و چه قابلیتی برای اجرای همزمان دارند از کجا می توانید بفهمید 100 درصد توان در چه حالتی بدست میاد؟ ثالثا مگه نخ پروسه برنامه شما در کارت گرافیکی اجرا میشه که فاصله بین براش ها کم بشه؟ کد شما بخاطر کندی روال های رسم در +GDI روان اجرا نمیشه، نه به این خاطر که کارت گرافیکی کند ئه. اون رسم شما که برای کارت گرافیکی کار پیچیده ای نیست، میتونید تصور کنید کارت گرافیکی تون اونقدر کندئه که بخاطر رسم چند تا براش کوچک اونقدر معطلی داره؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
در مورد پلاگین نویسی افترافکت در سی شارپ ، قبلا جزئی صحبت کردیم
اما الان میخوام اگه امکان اش هست ، بیشتر درباره اش بدونم
کلا میخواستم بدونم میشه در سی شارپ برای افترافکت پلاگین نوشت؟ (شما گفتین اگه با سی پلاس بشه ، با سی شارپ هم میشه اگه اشتباه نکنم)
اگه آره ، راهنمایی میکنین؟ (راهنمایی فقط در حد ابتدایی ترین ساخت پلاگین باشه تا صرفا نحوه ی کلی ساخت پلاگین را یاد بگیرم)
این لینک آموزش انگلیسی ساخت پلاگین افترافکت در سی پلاس پلاس هه ولی از اونجا که هم انگلیسی هه و هم توی آموزش ، طرف کدی رو ننوشت از ابتدا و فقط کدهای موجود را توضیح داد و هم اینکه سی پلاس بلد نیستم ، من چیزی متوجه نشدم :
FXPHD - SYS204 Plugin Development for Adobe Premiere and After Effects.zip - Shared with pCloud
ممنون
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
باز که برگشتید سر خونه اول، شما چند تا فرض اولیه در سوالتون دارید. اول اینکه پردازنده کارت گرافیکی در کدتون مورد استفاده قرار میگیره. دوم اینکه حداکثر 20 درصد توانش رو بکار میگیره. سوم اینکه میتوانست تمام توانش رو بکار بگیره. چهارم اینکه افزایش توانش باعث کاهش فاصله بین براش ها میشه.
اولا کارت گرافیکی رو اگه از مدار خارج کنید چیزی رو صفحه نمایشگر نشون نمیده، پس اینکه بگید چه اوقاتی بکار گرفته میشه ربطی به برنامه ها و کد شما نداره، هر لحظه در حال استفاده است. و بخش قابل توجهی از عملیات های ساده گرافیکی که سیستم عامل به برنامه ها ارائه می کنه، توسط کارت گرافیکی بصورت سخت افزاری در درایورش پیشتیبانی میشه، به همین جهت لزومی نداره که شما در کدتون کار خاصی انجام داده باشید، پردازنده کارت گرافیکی در همون عملیات های ساده گرافیکی GDI و +GDI هم ممکنه نقش داشته باشه که مربوط به کد درایورشه.
ثانیا شما مگر برای کدی که داخل برنامه تون در رسم گرافیکی می نویسید 100 توان پردازنده رو بکار میبرید که حالا برای پردازنده کارت گرافیکی هم 100 درصد توان رو انتظار دارید؟ مثال ساده ای بزنم، شما کدی می نویسید که نرخ رسمش 10 براش در ثانیه است، کندی اش هم مربوط به روال رسم خود پردازنده است، رسم گرافیکی براش رو هم می سپارید به پردازنده گرافیکی که میتونه در هر ثانیه 1000 تا براش رسم کنه. نرخ رسم همچنان 10 براش در ثانیه میمونه. این کارت گرافیکی رو با یک کارت گرافیکی دیگه که صد بار سریعتره هم عوض کنید فرقی نمی کنه. چون شما به هر حال هر ثانیه 10 تا براش رسم می کنید، هیچوقت هم کل توان پردازنده گرافیکی رو بکار نمی برید. در ضمن هیچ تصوری هم از توان کامل پردازنده گرافیکی ندارید، مثل همون قضیه هسته مجازی ئه که شما تا وقتی ندونید اون هسته های مجازی چطور کار می کنه و چه قابلیتی برای اجرای همزمان دارند از کجا می توانید بفهمید 100 درصد توان در چه حالتی بدست میاد؟ ثالثا مگه نخ پروسه برنامه شما در کارت گرافیکی اجرا میشه که فاصله بین براش ها کم بشه؟ کد شما بخاطر کندی روال های رسم در +GDI روان اجرا نمیشه، نه به این خاطر که کارت گرافیکی کند ئه. اون رسم شما که برای کارت گرافیکی کار پیچیده ای نیست، میتونید تصور کنید کارت گرافیکی تون اونقدر کندئه که بخاطر رسم چند تا براش کوچک اونقدر معطلی داره؟

ممنون استاد علی
الان یه سئوال
در کامپیوتر ، هر چیزی که بتونه از opencl یا opengl یا directx استفاده کنه ، پردازنده های گرافیکی را هم میتونه درگیر کنه؟
بعد اینکه gdi+ از اینا (opencl یا opengl یا directx) استفاده میکنه؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
در مورد پلاگین نویسی افترافکت در سی شارپ ، قبلا جزئی صحبت کردیم
اما الان میخوام اگه امکان اش هست ، بیشتر درباره اش بدونم
کلا میخواستم بدونم میشه در سی شارپ برای افترافکت پلاگین نوشت؟ (شما گفتین اگه با سی پلاس بشه ، با سی شارپ هم میشه اگه اشتباه نکنم)
اگه آره ، راهنمایی میکنین؟ (راهنمایی فقط در حد ابتدایی ترین ساخت پلاگین باشه تا صرفا نحوه ی کلی ساخت پلاگین را یاد بگیرم)
این لینک آموزش انگلیسی ساخت پلاگین افترافکت در سی پلاس پلاس هه ولی از اونجا که هم انگلیسی هه و هم توی آموزش ، طرف کدی رو ننوشت از ابتدا و فقط کدهای موجود را توضیح داد و هم اینکه سی پلاس بلد نیستم ، من چیزی متوجه نشدم :
FXPHD - SYS204 Plugin Development for Adobe Premiere and After Effects.zip - Shared with pCloud
ممنون
بهتره پلاگین نویسی رو از موردی شروع کنید که تخصص همه جانبه اش رو دارید، فقط انگلیسی و ++C که نیست. با دمپایی که صخره نوردی نمی کنند. مادامی که تخصصی در پردازش تصویر و روتین های پیچیده جلوه های ویژه نداشته باشید و مستندات تخصصی و مفصل SDK رو نخونده باشید چه پلاگینی برای Adobe Premiere و After Effects بسازید؟ شناختی از ساختارش ندارید که بخواهید برایش کدی بنویسید. اونم با یک زبان سطح بالا مثل #C که سرعت اجرا رو فدای سرعت کد نویسی می کنه.
برای هر نرم افزاری که بخواهید پلاگین بنویسید باید مستندات پلاگین نویسی اش رو مطالعه کنید، معمولا نمونه Template و Sample هم برای زبان های مختلف داره اما قطعا عملی نیست که برای هر کاربردی نمونه کد داشته باشه. یکسری متد های استاندارد و ضروری و اختیاری هست که پلاگین داره ولی بقیه اش دیگه چیزی که شما می نویسید، برای کاری که خودتون می خواهید بکنید دنبال نمونه کد نمیشه گشت. اگر دیدید برای #C نمونه پلاگین ای نداره معناش اینه که یا باید یک Wrapper به زبانی مثل ++C بنویسید که واسطه بشه یا باید با DllExport و ... متد های لازم رو Export کنید. یکسری کتابخانه ها رو ممکنه لازم بشه در کد Import کنید که مورد استفاده پلاگینه، قطعا یکسری متد های استاندارد رو هم باید در کدتون حتما پیاده سازی کنید، چطور که وقتی میخواهید اینترفیس ICloneable رو در کلاسی پیاده سازی کنید باید متد Clone رو بنویسید. همه چی بر اساس مستندات پلاگین نویسی اون نرم افزاره. تا مطالعه اش نکنید هیچ فایل ویدئویی و نمونه کدی بدردتون نمیخوره. اون روش تحلیل نمونه کد رو بذارید کنار، کاری که مستندات داره با مطالعه مستندات یاد بگیرید، نه تحلیل کدی که معلوم نیست اصولی هست یا نه، چقدر کامله یا برای چه کاری مناسبه. پلاگین نویسی برای هر نرم افزاری یه استانداردی داره و بر اساس مستنداته، نه اینکه یک نمونه کد رو تحلیل کنید تا ببینید چطور باید کد نویسی بشه.
 

the_king

مدیرکل انجمن
ممنون استاد علی
الان یه سئوال
در کامپیوتر ، هر چیزی که بتونه از opencl یا opengl یا directx استفاده کنه ، پردازنده های گرافیکی را هم میتونه درگیر کنه؟
اینها که اسم می برید کاری با پردازنده گرافیکی ندارند، پردازنده گرافیکی توسط درایورش اداره میشه، نه OpenGL و DirectX و ...
ارتباط مستقیم با سخت افزار وظیفه درایور ها است، کتابخانه DirectX که صرفا برای کارت گرافیکی فلان مدل که نوشته نشده، اگر اینطور بود چطور با هر پردازنده متفاوتی کار کنه؟
همانطور که Windows Media Player موقع پخش موسیقی کاری با پردازشگر کارت صوتی نداره، ممکنه اصلا سیستم کارت صوتی نداشته باشه.
کتابخانه های پردازش گرافیکی نهایتا درخواستشون رو از درایور می کنند، مستقیما با سخت افزار ارتباطی ندارند.
بعد اینکه gdi+ از اینا (opencl یا opengl یا directx) استفاده میکنه؟
نه، در نظر بگیرید که پردازش های +GDI و GDI فقط برای صفحه نمایشگر که نیست، روی Device Context ای که مربوط به پرینتر و پلاتر و ... هست هم رسم انجام میده. با سخت افزار خاصی هم ارتباط نداره. روی سیستمی که کارت گرافیکی نداره هم کار می کنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی
بله . پس باید با مستنداتش پیگیری کنم . لامصب سایت اش هم نیاز به قند شکن میخواد و هم دانلود sdk و ... اش که فعلا کار نمیکنن
درباره ی gdi+ هم آخر نحوه ی کارشون را متوجه نشدم . الان یعنی بدون اون رابط های گرافیکی (directx و opencl و opengl و vulkan و ...) ، برنامه ای میتونه از پردازنده ی گرافیکی استفاده کنه؟ پس این همه رابط گرافیکی واسه چی هستن؟!

بعد اینکه میخواستم بدونم چه تفاوت هایی بین دو زبان vb.net و c#.net وجود داره ؟
هر کاری که با سی شارپ میشه کرد رو با vb هم میشه انجام داد؟ منظورم استفاده از کلاس ها و اعضای دات نت نیست . منظورم در سطح زبان هست
اگه آره ، پس دلیل خلق سی شارپ چی بود؟
 

the_king

مدیرکل انجمن
سلام
ممنون استاد علی
بله . پس باید با مستنداتش پیگیری کنم . لامصب سایت اش هم نیاز به قند شکن میخواد و هم دانلود sdk و ... اش که فعلا کار نمیکنن
درباره ی gdi+ هم آخر نحوه ی کارشون را متوجه نشدم . الان یعنی بدون اون رابط های گرافیکی (directx و opencl و opengl و vulkan و ...) ، برنامه ای میتونه از پردازنده ی گرافیکی استفاده کنه؟

مطمئن هستید که پاسخ هام رو خوندید؟ وقتی ارتباط با پردازنده گرافیکی وظیفه درایور ئه و نه برنامه شما و نه DirectX و OpenGL و نه +GDI مستقیما با پردازنده گرافیکی کاری ندارند دیگه این سوال یا اون و بی اون چه معنی داره؟
پس این همه رابط گرافیکی واسه چی هستن؟!
برای اینکه هر توسعه دهنده نرم افزاری برای پردازش گرافیکی روی کارت های گرافیک مختلف و ناسازگار چرخ رو مستقلا از نو اختراع نکنه، برای اینکه محصولش محدود به یکی دو درایور خاص نباشه. که برای استفاده از قابلیت های کارت گرافیکی یک استاندارد مشخصی وجود داشته باشه. در ضمن فرض کنید OpenGL و DirectX و ... وجود نداشتند، این شما و اونم پردازنده گرافیکی و درایورش. ببینید دست خالی چیکار می توانید باهاش بکنید، در عرض چند ماه کد نویسی که قطعا هیچ نتیجه ای نمی گیرید. سالها باید وقت بذارید برای کد نویسی ابتدایی ترین روتین های گرافیکی، اونم صرفا برای یک درایور خاص که فقط با چند تا کارت گرافیک سازگاره. اگر DirectX نبود، موقع طراحی بازی یک نسخه مخصوص Nvidia GeForce GT 1030 طراحی میشد، یک نسخه مخصوص AMD Radeon RX 560، یک نسخه مخصوص GeForce GTX 970، یک نسخه مخصوص Intel HD Graphics 4600 و ...
بجای اینکه هر کسی بیاد برای پردازش گرافیکی بصورت غیر استاندارد و مستقل کتابخانه بسازه، اومدن یک استاندارد و معماری مشخصی طراحی کرده اند که سازندگان پردازنده گرافیکی هم پشتیبانیش کنند.
بعد اینکه میخواستم بدونم چه تفاوت هایی بین دو زبان vb.net و c#.net وجود داره ؟
منظورتون از تفاوت چیه؟ فرضا انگلیسی و فرانسه با هم فرق دارند. اگه منظورتون اینه که کسی که یکی شون رو بلد باشه امتیاز ویژه ای از دست میده یا برتری داره، نه، تفاوت آنچنانی ای وجود نداره. #C چون جدیدتره و از ابتدا هماهنگ با NET. طراحی شده و تمرکز مایکروسافت روی اونه، ساختار هماهنگ تری داره. VB.NET چون یکم از وصله پینه کردن ویژوال بیسیک کلاسیک حاصل شده به اندازه #C یکدست نیست.
تفاوت های اساسی شون رو هم که لازم نیست از من بپرسید، مقالات زیادی در موردش هست، هر کدوم طرفداران متعصب خودشون رو دارند :
Comparison of C Sharp and Visual Basic .NET
هر کاری که با سی شارپ میشه کرد رو با vb هم میشه انجام داد؟ منظورم استفاده از کلاس ها و اعضای دات نت نیست . منظورم در سطح زبان هست

هر کاری اگه منظورتون در کد نویسی ئه، تقریبا بله، چون تفاوت های زیادی دارند که انجام کاری در یک مورد ساده تر از اون یکی باشه، بعضی جاها معادلی برای یک ویژگی یا فرمان وجود نداره که شاید بهش عادت کرده باشید. اما اگه منظورتون در طراحی نرم افزار ئه، بله تا حد زیادی مشابه هستند. هیچ برنامه نویسی بخاطر انتخاب بین ایندو زبان تواناییش کمتر یا بیشتر نمیشه.
اگه آره ، پس دلیل خلق سی شارپ چی بود؟
در ویکی پدیا Design goals رو که برای #C نوشته مطالعه کنید، توقعاتی از زبان داشتند که هر چقدر هم ویژوال بیسیک رو تغییر میدادند بدست نمیومد.
ویژوال بیسیک خودش وارث زبان بیسیک ئه که بیشتر از 50 سال از عمرش میگذره. هر چقدر هم سعی در مدرن سازی اش بشه همچنان بخشی از ساختار قدیمی طراحیش رو داره. به همین جهت VB.NET زبان یکدست مدرنی نبود، برای بخش قابل توجهی از برنامه نویسان حرفه ای که زبان های مورد علاقه شون ++C/C بود هم جذابیتی نداشت.وقتی یک پلتفرم کاملا متفاوت مثل NET. طراحی میشه، همینطوری هم برای شرکت ها و برنامه نویسانی که باید برای استفاده اش زحمت یادگیری مطالب جدید رو بکشند مقاومت ایجاد می کنه. مهاجرت از VB به VB.NET همینطوری هم مخالفان زیادی داشت، چون کاملا سازگاری نداشتند. مایکروسافت با طراحی زبان جدید #C سعی کرد، بجای اون برنامه نویسان VB که از VB.NET استقبال نکردند و جذبش نشدند، تازه کار ها و برنامه نویسان زبان هایی مثل ++C/C و Java که فرمت #C براشون آشنا و مدرن بود رو جذب پلتفرم جدیدش بکنه. نیاز به یک زبانی بود که هم برنامه نویسان حرفه ای سایر زبان ها رو جذب کنه و هم تطابق بهتری با پلتفرم جدید داشته باشه. VB.NET برای تازه کاران و برنامه نویسان VB جذابیت هایی داشت، اما ساختار اصلی اش همچنان قدیمی و بر اساس استاندارد های زمان طراحی بیسیک و ویژوال بیسیک بود. نه برای برنامه نویسان ++C/C و Java آشنا به نظر میومد و نه برای استاندارد های پلتفرم جدید گزینه درجه یکی بود. کسی VB.NET رو انتخاب می کرد که یا قبلا برنامه نویس Visual Basic بود یا شناختی از ++C/C هم نداشت که انتخاب #C برایش مزیتی باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
آها ممنون از جواب کامل تون (هم درباره ی رابط گرافیکی و هم مقایسه vb.net و c#.net)
پس طراحی سی شارپ بخاطر اینه که هم زبان مدرن باشه که توانایی جذب کاربران زبان های سی پلاس پلاس و جاوا را داشته باشه و هم کاملا یکپارچه در ارتباط با دات نت عمل کنه
ولی به نظرم علاوه بر سی شارپ ، خیلی بهتر میبود یا بهتر میشه که مایکروسافت یه زبان دیگه به راحتی سی شارپ و این بار بدون وابستگی به دات نت بسازه که رقیب عملی سی پلاس پلاس باشه و سرعتش هم در حد سی پلاس پلاس باشه و مثل سی پلاس پلاس ، هیچ گونه وابستگی ای به سیستم عامل یا دات نت نداشته باشه تا در هر سیستم عاملی با یک قدرت بشه براش برنامه نوشت
الان در این حوزه ، فقط سی پلاس پلاس یکه تازه (اگه هم بشه رقیبی براش در نظر گرفت ، جاواست)
 

the_king

مدیرکل انجمن
سلامی مجدد
آها ممنون از جواب کامل تون (هم درباره ی رابط گرافیکی و هم مقایسه vb.net و c#.net)
پس طراحی سی شارپ بخاطر اینه که هم زبان مدرن باشه که توانایی جذب کاربران زبان های سی پلاس پلاس و جاوا را داشته باشه و هم کاملا یکپارچه در ارتباط با دات نت عمل کنه
ولی به نظرم علاوه بر سی شارپ ، خیلی بهتر میبود یا بهتر میشه که مایکروسافت یه زبان دیگه به راحتی سی شارپ و این بار بدون وابستگی به دات نت بسازه که رقیب عملی سی پلاس پلاس باشه و سرعتش هم در حد سی پلاس پلاس باشه و مثل سی پلاس پلاس ، هیچ گونه وابستگی ای به سیستم عامل یا دات نت نداشته باشه تا در هر سیستم عاملی با یک قدرت بشه براش برنامه نوشت
الان در این حوزه ، فقط سی پلاس پلاس یکه تازه (اگه هم بشه رقیبی براش در نظر گرفت ، جاواست)
اولا استاندارد #C جدا از #C ای است که با ویژوال استدیو استفاده می کنید، لذا #C نیازی نیست که حتما با NET Framework. باشه. همونطور که Mono وجود داره. سرعت اجرا هم بخاطر خود زبان کند نشده، اینا بستگی به کامپایلر و ماشین مجازی داره. ++C بخاطر Native بودن کد اجراییش سریع ئه، وگرنه #C و ++C شباهت های زیادی دارند. در ضمن عدم وابستگی به سیستم عامل و کتابخانه الزاما چیز خیلی خوبی نیست، همونطور که یکی از مشکلات بزرگ ++C از لحاظ قابلیت حمل کد همینه که استاندارد های متفاوتی داره با کتابخانه های مختلفی که برای یک کار خاص باید بین انواع گزینه های ناسازگار از منابع مختلف یکی رو انتخاب کنید، و هر کدوم صرفا روی پلتفرم های خاصی کار می کنند و انواع کامپایلر هایی که با هم سازگاری ندارند و خطا های جورواجور مخصوص هر کامپایلر و پلتفرم.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اولا استاندارد #C جدا از #C ای است که با ویژوال استدیو استفاده می کنید، لذا #C نیازی نیست که حتما با NET Framework. باشه. همونطور که Mono وجود داره. سرعت اجرا هم بخاطر خود زبان کند نشده، اینا بستگی به کامپایلر و ماشین مجازی داره. ++C بخاطر Native بودن کد اجراییش سریع ئه، وگرنه #C و ++C شباهت های زیادی دارند. در ضمن عدم وابستگی به سیستم عامل و کتابخانه الزاما چیز خیلی خوبی نیست، همونطور که یکی از مشکلات بزرگ ++C از لحاظ قابلیت حمل کد همینه که استاندارد های متفاوتی داره با کتابخانه های مختلفی که برای یک کار خاص باید بین انواع گزینه های ناسازگار از منابع مختلف یکی رو انتخاب کنید، و هر کدوم صرفا روی پلتفرم های خاصی کار می کنند و انواع کامپایلر هایی که با هم سازگاری ندارند و خطا های جورواجور مخصوص هر کامپایلر و پلتفرم.

ممنون استاد علی
سرعت اجرا ، ربط به کمپایلر هم داره؟ کمپایلر مگه اونی رو نمیگن که زمان برنامه نویسی اتفاق میافته؟ (مثلا محیط intellicense و ساز و کار محیط موقع برنامه نویسی)
خوب منم همین رو میگم که یه زبان native بدون وابستگی به ماشین مجازی (clr) طراحی میکرد مثل سی پلاس پلاس تا در سرعت و وابسته نبودن به سیستم عامل هم رقیب سی پلاس پلاس میشد
الان C# Mono ، در واقع native هه و وابستگی ای به دات نت نداره؟ تنها تفاوت Mono با زبان هایی مثل سی پلاس پلاس و جاوا در استفاده از ماشین مجازی و clr اش هست که باعث میشه سرعت اجراش کمتر از اون دو زبان بشه ؟ یعنی در واقع تفاوت C# Mono با اون دو زبان ، فقط در سرعت اجراش هست؟
اگه فقط همینه ، اول اینکه زامارین از C# Mono استفاده میکنه دیگه؟ درسته؟ پس چرا خیلی ها میگن که جاوا برای اندروید خیلی قویتر از زامارین و C# Mono عمل میکنه و خود گوگل هم جاوا را پیشنهاد میده؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
سرعت اجرا ، ربط به کمپایلر هم داره؟ کمپایلر مگه اونی رو نمیگن که زمان برنامه نویسی اتفاق میافته؟ (مثلا محیط intellicense و ساز و کار محیط موقع برنامه نویسی)

اونی که شما صحبتش رو می کنید جزو Editor ئه، IntelliSense به شما کمک می کنه که راحت تر کد رو بنویسید و ویرایش کنید. شما می توانید کد رو در Notepad یا ویژوال استدیو بنویسید، سرعت Editor جدا از قابلیت های کامپایلر ئه. شما کد رو در یک دقیقه یا یک سال هم بنویسید کد نهایتا باید کامپایل بشه. ممکنه یک کامپایلر خروجی بهینه تری ایجاد کنه، از ماشین مجازی سریعتری استفاده کنه، اصلا کد Native بسازه و ...
موقع کامپایل هم مهم نیست کد با کمک IntelliSense نوشته شده یا کمک همکلاسی تون. کامپایل کردن یک روال جدا است. ممکنه برای یک زبان خاص چندین کامپایلر وجود داشته باشه با خروجی های متفاوت که سرعت اجرای متفاوتی دارند.
خوب منم همین رو میگم که یه زبان native بدون وابستگی به ماشین مجازی (clr) طراحی میکرد مثل سی پلاس پلاس تا در سرعت و وابسته نبودن به سیستم عامل هم رقیب سی پلاس پلاس میشد
تصور درستی از Native ندارید، Native خودش یعنی بومی. مثلا مردم بومی، native people. کد Native وابسته به یک پلتفرم خاص ئه، مربوط به یک سیستم عامل خاص ئه. بومی اون پلتفرم ئه. نمیشه که هم Native باشه و هم در سیستم عامل متفاوتی اجرا بشه.

الان C# Mono ، در واقع native هه و وابستگی ای به دات نت نداره؟ تنها تفاوت Mono با زبان هایی مثل سی پلاس پلاس و جاوا در استفاده از ماشین مجازی و clr اش هست که باعث میشه سرعت اجراش کمتر از اون دو زبان بشه ؟ یعنی در واقع تفاوت C# Mono با اون دو زبان ، فقط در سرعت اجراش هست؟

نه، ربطی به Native ندارند هیچکدوم، Mono و NET. مثل coca cola و pepsi دو تا پلتفرم مشابه با ویژگی های متفاوت هستند. وقتی در مورد موضوعی مطالعه نکنید سوال های براتون ایجاد میشه که فرض اشتباهی داره، شما نمی توانید ++C و Java رو در مقابل #C با ماشین مجازی قرار بدید، چون جاوا خودش ماشین مجازی داره. هیچ الزامی هم وجود نداره ++C حتما کامپایلر Native داشته باشه، ممکنه یک کامپایلر بیاد ++C رو مثل جاوا به کد های تحت JVM تبدیل کنه که اصلا Native نباشه، چطور که در ویژوال استدیو C++ CLI هست. شما وقتی زبان رو با زبان مقایسه می کنید نمی توانید کامپایلر رو بجای زبان مقایسه کنید، انگار که موقع مقایسه کردن دونده های ماراتن بخواهید بجای خود دونده کفش اش رو مقایسه کنید. طبیعتا هم جستجو ای در مورد مقایسه سرعت #C و Java نداشتید.

اگه فقط همینه ، اول اینکه زامارین از C# Mono استفاده میکنه دیگه؟ درسته؟ پس چرا خیلی ها میگن که جاوا برای اندروید خیلی قویتر از زامارین و C# Mono عمل میکنه و خود گوگل هم جاوا را پیشنهاد میده؟
از چی به چی نتیجه گیری می کنید؟ حرف هایی که میزنید ربطی نداره بهم. xamarin از هر چی میخواد استفاده کنه، ربطی به توصیه گوگل یا کارایی #C و Java نداره. موقع غذا خوردن قاشق کارایی اش از بیل بیشتره ولی موقع شخم زدن زمین برعکس. اینکه بهتون بیل رو توصیه کنن نه دلیلش اینه که دسته بیل چوبی ئه و نه اینکه چون قاشق از استیل ساخته شده مناسب نیست.
مطالعه کردید ببینید اندروید با چه زبان هایی نوشته شده و SDK اش بر اساس چه زبانهایی ئه؟ درضمن توقع دارید گوگل زبان های مختلف رو مقایسه کنه و بعد هر کدوم بهتر کار کرد اون رو بهتون توصیه کنه؟ ملاک گوگل برای توصیه جاوا رو چی قرار میدید؟ اینکه کدوم قوی ترعمل کنه یا حرف مردم یا سلیقه مدیرانش؟ یک شرکتی مثل گوگل برای سرمایه گذاری روی یک پلتفرم تصمیماتش رو اینطوری سطحی بر اساس اینکه چی قوی تره، سالاره، حرف نداره، خیلی توپ ئه انجام میده؟ شرکت ها برای همکاری با هم قرارداد دارند، سرمایه گذاری می کنند، منافع مشترک دارند، قبلا روی زبانی پلتفرم رو طراحی کردند. همینطوری که شرکتی نمیاد از بین محصولات شرکت های رقیب موردی رو توصیه کنه. در ضمن نهایتا توصیه اش بر اساس مسائل فنی و منافع خودشه، نه ارزیابی های بی طرف. در ضمن سلیقه ها کاملا متفاوته.
 

SU-57

Active Member
سلام
من سوالاتی که می پرسم از روی فیلم های آقا سجاده ولی دوست دارم که استاد علی شما هم پاسخ بدی اگه نکته ای رو احساس می کنی باید بدونم ولی اگه خود آقا سجاد راه حل رو می دونه که خودش جواب میده.
______________________________
آقا سجاد توی فیلم اینو گفتی که من به شیوه خودم می نویسم:

1- مقدار پیش فرض همه کلاس ها null است مثل کلاس string و مقدار null غیر قابل نمایشه

اما من کد زیر رو نوشتم و null رو نمایش میده

کد:
string[] a = new string[10];
MessageBox.Show(a[5]);

2- در کد زیر اگه اعداد 10 یا 20 یا 30 رو بدم ایندکس درست رو بر می گردونه ولی اگه عددی غیر از اون بدم مثلا 1- یا 4- بر می گردونه. می خوام بدونم چرا مثلا نمی نویسه که این عدد در این آرایه نیست. کلا کاربردهای این نوع کد نوشتن چیه و در کجا ها به کار میره

کد:
Array array1 = new int[] { 10, 20, 30 };
int result = Array.BinarySearch(array1, 1);
MessageBox.Show(result.ToString());

3- من کد زیر رو نوشتم و باید ایندکس 0 رو برگردونه ولی 3- رو بر می گردونه

کد:
Array names = new string[] { "Asghar", "Akbar", "Sajjad" };
int result = Array.BinarySearch(names, "Asghar");
MessageBox.Show(result.ToString());
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
من سوالاتی که می پرسم از روی فیلم های آقا سجاده ولی دوست دارم که استاد علی شما هم پاسخ بدی اگه نکته ای رو احساس می کنی باید بدونم ولی اگه خود آقا سجاد راه حل رو می دونه که خودش جواب میده.
______________________________
آقا سجاد توی فیلم اینو گفتی که من به شیوه خودم می نویسم:

1- مقدار پیش فرض همه کلاس ها null است مثل کلاس string و مقدار null غیر قابل نمایشه

اما من کد زیر رو نوشتم و null رو نمایش میده

کد:
string[] a = new string[10];
MessageBox.Show(a[5]);

2- در کد زیر اگه اعداد 10 یا 20 یا 30 رو بدم ایندکس درست رو بر می گردونه ولی اگه عددی غیر از اون بدم مثلا 1- یا 4- بر می گردونه. می خوام بدونم چرا مثلا نمی نویسه که این عدد در این آرایه نیست. کلا کاربردهای این نوع کد نوشتن چیه و در کجا ها به کار میره

کد:
Array array1 = new int[] { 10, 20, 30 };
int result = Array.BinarySearch(array1, 1);
MessageBox.Show(result.ToString());

3- من کد زیر رو نوشتم و باید ایندکس 0 رو برگردونه ولی 3- رو بر می گردونه

کد:
Array names = new string[] { "Asghar", "Akbar", "Sajjad" };
int result = Array.BinarySearch(names, "Asghar");
MessageBox.Show(result.ToString());

سلام آقا رامین . نیستی . هر یه سال درمیون میای؟ :green:

1) مقدار پیش فرض کلاس ، null هست ولی وقتی آرایه ای از int ها ساختید ، خود int استراکچر هه و (بصورت پیش فرض) null پذیر نیست و مقدار میگیره حتی اگه مقدار ندید (البته متغییرهای محلی int این طور نیستن . یعنی اصلا قبل از مقداردهی ، نمیتونین فراخونی شون کنین اما به این معنی نیست که null باشن) . پس بنابراین مقدار a[5] بصورت پیش فرض در مثال اول ، صفر هست

2) مقدار خروجی اش int هه . باید عدد برگردونه . نمیتونه بجاش رشته برگردونه که چیزی بنویسه . ضمن اینکه طراح متد ، تصمیم میگیره که چی رو برگردونه . کلا اگه این متد ، عدد منفی برگردونه ، یعنی چیزی پیدا نکرد

3) این متد Array.BinarySearch ، بصورت باینری جستجو میکنه . جستجوی باینری هم این رو در نظر میگیره که موقع جستجو ، اون آرایه قبلا مرتب شده هست . الگوریتم کلی جستجوی باینری :

جستجوی باینری یا دودویی :: آموزش برنامه نویسی به زبان ++C

بنابراین اگه آرایه مرتب نشده باشه ، چیزی پیدا نمیکنه و عدد منفی برمیگردونه . باید اول آرایه تون را مرتب کنید :


کد:
            Array names = new string[] { "Akbar", "Asghar", "Sajjad" };
            int result = Array.BinarySearch(names, "Asghar");
            MessageBox.Show(result.ToString());
 

the_king

مدیرکل انجمن
سلام
آقا سجاد توی فیلم اینو گفتی که من به شیوه خودم می نویسم:
1- مقدار پیش فرض همه کلاس ها null است مثل کلاس string و مقدار null غیر قابل نمایشه

اما من کد زیر رو نوشتم و null رو نمایش میده

کد:
string[] a = new string[10];
MessageBox.Show(a[5]);
غیر قابل نمایش بودن با معتبر نبودن به عنوان مقدار یک پارامتر فرق می کنه، Show اون null رو به عنوان مقدار پارامتر قابل قبول می پذیره، یک متد دیگه ممکنه همین null رو به عنوان مقدار پارامتر غیر قابل قبول تفسیر کنه و خطا ایجاد کنه، این چیزی نیست که به عنوان یک قاعده کلی در نظر بگیرید که چون null قابل نمایش نیست، پس باید خطا رخ بده یا حتی بجایش مقدار دیگری نمایش داده نشه. هر متدی بنا به کد اش با مقادیر null رفتار متفاوتی داره، چه در مورد string ها و چه سایر انواع داده ای null شدنی.

2- در کد زیر اگه اعداد 10 یا 20 یا 30 رو بدم ایندکس درست رو بر می گردونه ولی اگه عددی غیر از اون بدم مثلا 1- یا 4- بر می گردونه. می خوام بدونم چرا مثلا نمی نویسه که این عدد در این آرایه نیست. کلا کاربردهای این نوع کد نوشتن چیه و در کجا ها به کار میره

کد:
Array array1 = new int[] { 10, 20, 30 };
int result = Array.BinarySearch(array1, 1);
MessageBox.Show(result.ToString());
اینکه اعلام کنه مقدار در آرایه موجود نیست از دو جهت مشکل سازه، اولا ممکنه شما در کدی بکارش می برید که نباید هیچ اعلام و پیامی نمایش داده بشه، دلیلی نداره یک متد پیامی رو به کاربر نشون بده که فقط قرار بوده برنامه نویس در کد ازش با خبر بشه. ثانیا صرفا اینکه بدونید عضو در آرایه نیست، گاهی اطلاعاتی که به قدر کافی باشه نیست، مثلا زمانی که جستجوی باینری انجام میدید که همیشه روی مجموعه های از قبل مرتب شده انجام میشه. حالا که عضو در آرایه نیست، چکاری انجام خواهید داد؟ شاید بخواهید به مجموعه اضافه اش کنید، اما کجای مجموعه؟ الان تازه یک مشکل جدید رخ میده، چون نمیدونید در کجای مجموعه باید اضافه اش کنید تا همچنان آرایه مرتب بمونه. ماهیت جستجوی باینری طوری ئه که همون موقع جستجو مشخص میشه کجا باید اضافه بشه، بدون هیچ عملیات اضافه ای. به همین جهت BinarySearch طوری طراحی شده که حتی اگر مقدار رو پیدا نکرد، موقعیت مناسبش در مجموعه رو توصیه کنه. با اعداد غیر منفی که نمیتونه اینکار رو انجام بده چون با حالتی که مقدار در مجموعه پیدا شد تداخل داره. اون اعداد منفی فقط مشخص کننده این واقعیت نیستند که اون مقدار در مجموعه پیدا نشد، 1- و 4- یک معنی یکسان ندارند، مقادیر منفی مشخص می کنند که اگر بخواهید به عنوان عضو جدید به مجموعه اضافه شون کنید باید در چه موقعیتی قرار بگیرند تا مجموعه همچنان مرتب باقی بمونه. 1- یعنی پیدا نشد و بر اساس ترتیب مجموعه این عضو باید در موقعیت 0 قرار بگیره تا مجموعه همچنان مرتب باشه. 4- یعنی پیدا نشد و بر اساس ترتیب مجموعه این عضو باید در موقعیت 3 قرار بگیره تا مجموعه همچنان مرتب باشه و ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی . باز اومدم :green:
میگم که اگه بخوام برنامه ای بنویسم که مثلا از درایوی (مثلا تمامی فلش ها یا همون removable drive) ، کاری کنم که نتونه فایلی را از درونش به سیستم کامپیوتر منتقل کنه (یعنی نتونه فایلی را از درون اون فلش به درایوهای دیگه ، copy یا cut کنه) . حالا چه از طریق ویندوز (یعنی بدون برنامه نویسی) که در این صورت قطعا از حافظه ی کلیپ برد برای کپی و پیست استفاده میکنه و یا چه از طریق برنامه نویسی (مثلا ویروسی رو که بصورت اتوران و با فایل inf طرف بنویسه که با متصل کردن فلش اجرا بشه و از اون طریق بتونه فایل شو در هارد طرف مقابل ، از درون فلش کپی کنه) .
اگه از طریق عادی (نه از طریق برنامه نویسی) بود ، الگوریتم اش دشوار نبود و با مدیریت و نظارت بر کلیپ برد ، شدنی بود.
اما وقتی بصورت برنامه نویسی هم میاد ، در این صورت طرف میتونه از کلیپ برد استفاده نکنه و فایل اش را کپی کنه .
در این صورت راهی هست؟ اگه آره ، چه سودوکد و کلا چه روشی را پیشنهاد میدید؟ (کد نمیخوام . فقط روش کلی رو میخوام بدونم چجوری هست)؟
شاید بشه با نظارت بر گزارشات فایل ، این کار را کرد . درباره اش چیزی نمیدونم. کلا وقتی فایلی ایجاد میشه ، گزارشی در event viewer (یا از هر طریق دیگه ای) ، داده میشه؟ (تا بشه با نظارت بر event viewer ، ازش اطلاع پیدا کرد) . و مهمتر اینکه وقتی فایلی بوجود اومد که منبعش ، کپی شده از جای دیگه ای بود ، توی گزارشاتش میگه از کجا بود؟
کلا روشی به ذهن تون میرسه؟
ممنون
 

the_king

مدیرکل انجمن
سلام استاد علی . باز اومدم :green:
میگم که اگه بخوام برنامه ای بنویسم که مثلا از درایوی (مثلا تمامی فلش ها یا همون removable drive) ، کاری کنم که نتونه فایلی را از درونش به سیستم کامپیوتر منتقل کنه (یعنی نتونه فایلی را از درون اون فلش به درایوهای دیگه ، copy یا cut کنه) . حالا چه از طریق ویندوز (یعنی بدون برنامه نویسی) که در این صورت قطعا از حافظه ی کلیپ برد برای کپی و پیست استفاده میکنه و یا چه از طریق برنامه نویسی (مثلا ویروسی رو که بصورت اتوران و با فایل inf طرف بنویسه که با متصل کردن فلش اجرا بشه و از اون طریق بتونه فایل شو در هارد طرف مقابل ، از درون فلش کپی کنه) .
اگه از طریق عادی (نه از طریق برنامه نویسی) بود ، الگوریتم اش دشوار نبود و با مدیریت و نظارت بر کلیپ برد ، شدنی بود.
اما وقتی بصورت برنامه نویسی هم میاد ، در این صورت طرف میتونه از کلیپ برد استفاده نکنه و فایل اش را کپی کنه .
در این صورت راهی هست؟ اگه آره ، چه سودوکد و کلا چه روشی را پیشنهاد میدید؟ (کد نمیخوام . فقط روش کلی رو میخوام بدونم چجوری هست)؟
شاید بشه با نظارت بر گزارشات فایل ، این کار را کرد . درباره اش چیزی نمیدونم. کلا وقتی فایلی ایجاد میشه ، گزارشی در event viewer (یا از هر طریق دیگه ای) ، داده میشه؟ (تا بشه با نظارت بر event viewer ، ازش اطلاع پیدا کرد) . و مهمتر اینکه وقتی فایلی بوجود اومد که منبعش ، کپی شده از جای دیگه ای بود ، توی گزارشاتش میگه از کجا بود؟
کلا روشی به ذهن تون میرسه؟
ممنون
شما دارید از اجرای سطح کاربری حرف می زنید، مثل اینه که داخل اتاق تون بنشینید ولی بخواهید از همونجا نگهبانی بدید که نگذارید کسی از راهرو عبور کنه، نمیشه. نرم افزار هایی که اینجور نظارت ها رو دارند، اعم از آنتی ویروس و فایروال و غیره، در سطح سیستمی اجرا میشن، یعنی یک یا چند درایوری دارند که روی عملیات سیستم نظارت داره و میتونه رویدادی رو درست در شروعش متوقف کنه یا روال رو تغییر بده، نه اینکه در سطح کاربری بعد تاخیر وقتی کاری به اتمام رسید تازه متوجهش بشوید و بعد تازه بخواهید کاری بکنید. اجراشم یک بحث خیلی سنگین و تخصصیه و چون صحبت درایور ئه، اگر بخواهید برای استفاده سایرین طراحی اش کنید به مشکل بر میخورید چون در سیستم عامل های مدرن نصب شدنش بصورت پیشفرض نیاز به تاییدیه لابراتوار مایکروسافت داره که با ویندوز و استاندارد هاش سازگاری داشته باشه، و هزینه دلاری داره.
File System Filter Driver Development
 

جدیدترین ارسال ها

بالا