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

the_king

مدیرکل انجمن
منظورم کلا این بود که چجوری میشه یه هندلی رو گرفت و تبدیل کرد جوری که بشه با کلاس های خود سی شارپ ، با اون ویندوز کار کرد . بدون API
تمامی پنجره های ویندوز با API کار می کنند، بدون استثناء. اگر میخواهید خودتان کد ننویسید می توانید دنبال کتابخانه بگردید وازش استفاده کنید، اما به هر حال داخل کتابخانه ها از توابع API استفاده شده. زبان #C هم خودش اصلا کلاسی نداره. کلاس های NET Framework. مثل Form ها هم متدی مثل FromHandle ندارند که ازتون Handle بگیرند و شیء بسازند، به همون دلیلی که قبلا گفتم. هر پنجره ای معادل فرم های NET. نیست که از یک برنامه دیگه پنجره رو بیاورید و به فرم #C تبدیل کنید. دو تا جنس کاملا متفاوته. هر دو شون Window داره ولی شیء Form فقط پنجره نیست. فرم های NET. شیء و کلاس مخصوص خودشون رو دارند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اتوپلی با فرم NET. تون ارتباط برقرار نمی کنه، با همون توابع API و بر اساس یک Handle کار می کنه و در حد همون امکانات، مثلا شما در فرم تون Anchor دارید، KeyPreview دارید، اینها پروپرتی های Form های NET. اند، همه پنجره ها Handle دارند ولی این پروپرتی ها خاص NET. ئه. اتوپلی که نمی تونه به این شیء Form و این پروپرتی ها دسترسی داشته باشه، میتونه؟ شما آیکون پنجره های NET. رو با کدوم دستور اتوپلی عوض می کنید؟ Opacity پنجره های NET. رو که بدون دستورات API نمیشه تغییر داد، حالا یا با پلاگین یا بدون پلاگین.
این توابعی که شما در اتوپلی بکار می برید کتابخانه اند، اونها رو با کمک توابع API نوشته اند، جزو دستورات زبان اسکریپتی اتوپلی که نیستند.
آره میدونم . در واقع به نظرم همه ی کدهای اتوپلی یا حداقل بالای 90 و خردی درصد از کدهای اتوپلی ، یا توابع API اند یا توابع لوا
خودش از خودش چیزی نداره . البته کمپایلر داره که شما گفته بودین وگرنه نمیدونستم :green:
منظورم همون توابع API هه . الان بیشتر متوجه شدم . چون گفتین که فرم های سی شارپ اولا ویندوز هستن پس هندل دارن و پس توابع API (که مثلا قسمت کدهای Windows اتوپلی هم که از این توابع استفاده میکنه) میتونن باهاشون کار کنن اما بر عکس ، سی شارپ هم در صورتی که مثل اتوپلی که از توابع API استفاده میکنه ، سی شارپ هم از کلاسی که از این توابع API استفاده کنه هم میشه با پنجره های دیگه ، ارتباط برقرار کنه ولی به هیچ وجه با توابع دات نت نمیتونه اون پنجره ها رو به فرم ها و کنترل های خودش (دات نت) تبدیل و با اون روش باهاش کار کنه . درست متوجه شدم؟
بر عکسش هم توابع API (که اتوپلی هم ازش استفاده میکنه) نمیتونن به اعضای کلاس های دات نت و کنترل هاش دسترسی پیدا کنن و پروپرتی های مورد نظرش رو تغییر بدن . ولی این پروپرتی هایی که میشه ازش تغییر داد (مثل سایز ویندوز و ...) صرفا پروپرتی های قسمت ویندوز پنجره ی سی شارپ هست که API ها بهش دسترسی دارن نه اینکه پروپرتی های فرم یا کنترل دات نت باشه . درسته؟
خوب اینو از اول ، واضح تر میگفتین
:green:

کتابخانه های زیادی برای NET. موجود اند که شامل توابع پنجره با استفاده از API ویندوز هستند و شما می توانید در پروژه هایتان بهشان رفرنس بدهید، شما اینها رو جزو #C حساب می کنید؟
احسنت . منم همین رو میگم . نام این کلاس ها رو فقط بهم بگین چی ها هستن؟
آره . اینا رو جزء سی شارپ به حساب می آوریم :green: یعنی همون جزء کلاس های دات نت که گفتین :green:


شما فراخوانی دستور API از داخل #C رو جزو کد نویسی به زبان #C حساب نمی کنید، اما کتابخانه ناقص Window اتوپلی رو جزو زبان اتوپلی حساب می کنید، فقط به این خاطر که از قبل آماده است. کلاس Process رو جزو زبان #C حساب می کنید، چون از قبل کتابخانه اش در پروژه تان رفرنس داده شده، در حالی که Process ربطی به #C نداره، جزئی از محتویات کتابخانه های استاندارد NET. ئه. کل کلمات کلیدی زبان #C اینها است، هر چی بجز اینها ربطی به زبان #C نداره :
C# Keywords
اتوپلی هم مثل سایر نرم افزار ها است، بدون توابع API ویندوز نمی تونه با هیچ پنجره ای ارتباط برقرار کنه.

ای خدا :) :green:
 

SajjadKhati

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

البته بجز اون کلاس های (که ممنون میشم بگین) ، کلاس هایی در دات نت وجود دارن که با استفاده از توابع api ، کنترل ها مثل کنترل کمبوباکس و button و ... رو هم بسازن؟ اگه آره ، نام اون کلاس ها رو هم میگین؟
ممنون
 

the_king

مدیرکل انجمن
البته بجز اون کلاس های (که ممنون میشم بگین) ، کلاس هایی در دات نت وجود دارن که با استفاده از توابع api ، کنترل ها مثل کنترل کمبوباکس و button و ... رو هم بسازن؟ اگه آره ، نام اون کلاس ها رو هم میگین؟
ممنون
اگه منظورتون از کنترل، کنترل های استاندارد ویندوز باشه، کنترل ساختن همون ساختن پنجره است، هر کنترلی یک کلاس ثبت شده داره، موقع ساختن پنجره اون کلاس رو مشخص می کنند، یعنی یک فرمت کلی بیشتر نداره.
همه شون CreateWindow یا CreateWindowEx اند. من در NET Framework چنین چیزی رو ندیدم، یعنی انجام میشه اما برای ساختن کنترل های خود NET.
CreateWindowEx function
سایر توابع پنجره هم در اون لینک بالا هست.
در نظر بگیرید که ساختن کنترل به تنهایی کافی نیست، باید Message هاش رو مدیریت کنید، فرضا وقتی پروسه ای برای مدیریت Message هایش نداشته باشید که نمی توانید موقع کلیک شدنش متوجه شوید. برای همین موارد ئه که ساختن کنترل مدیریت نشده کاربردی نیست.

اگه net window functions wrapper. رو تو گوگل جستجو کنید نمونه های زیادی هست، اعم از کلاس و کتابخانه آماده NET.
مثلا Managed Windows API که فایلش رو هم پیوست این پست کردم.

کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            var w = new ManagedWinapi.Windows.SystemWindow(this);
            w.Title = "Test";
            w.Position = new ManagedWinapi.Windows.RECT(10, 400, 500, 500);           
        }
 

پیوست ها

  • managedwinapi-0.3.zip
    390 کیلوبایت · بازدیدها: 7

SajjadKhati

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

:rose::rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، دو تا سئوال دارم :
اول اینکه enum ای بنام WindowExStyleFlags (منظورم WindowStyleFlag نیست) ساخته شد ولی در اعضای کلاس SystemWindow اصلا بکار گرفته نشد (یعنی برگردونده یا خواسته نشد) . پس اگه بخوایم از این enum استفاده کنیم در ویندوزمورد نظرمون ، باید چی کار کنیم؟ (منظورم enum ای که نامش WindowStyleFlag هه ، نیست که در پروپرتی Style در کلاس SystemWindow برگردونده میشه)

دوم و مهم تر اینکه من هر کاری میکنم ، در کد زیر ، نمیتونه بعضی از پروپرتی های (مثلا پروپرتی size یا location یا posation) کنترل هایی (مثل کنرل button و کمبوباکس و لیست باکس و هر کنترل دیگه ای) که داخل پنجره ی اصلی مورد نظرم هستن رو دستکاری کنه (set کنه) یا تغییر بده در صورتی که نام کلاس و title و حتی بقیه ی اطلاعاتی که از اون کنترل ها رو میگیرم و get میکنم ، درست برمیگردونه . اما کنترل کانتینر (کانتینر ای که کنترل ها توش هستن) و پنجره اصلی ویندوزم رو میتونه دستکاری کنه (میتونه تغییر سایز و ... بده و اون پروپرتی ها روش کار میکنن)
دلیل اش چیه؟ راهی و کدی داره که کنترل های داخل یه پنجره رو دستکاری کرد؟


کد:
foreach (Process process in Process.GetProcesses())
            {
                if (process.MainWindowTitle == "My Project")
                {
                    SystemWindow winApi = new SystemWindow(process.MainWindowHandle);

                    foreach (SystemWindow childWin in winApi.AllDescendantWindows)
                    {
                        if (childWin.ClassName.Contains("Combo"))
                        {
                            childWin.Size = new Size(100, 50);
                        }
                    }
                }
            }


تایتل پنجره ی من ، "My Project" هه . اطلاعات کنترل ها رو دقیق میتونه بخونه و تغییر نمیتونه بده
در واقع ، با این کد ، اون صفحه ی داخل کمبوباکس (لیست کشویی کمبوباکس) ، اونم پهناش تغییر میکنه ولی من میخوام خود کمبوباکس تغییر سایز بده
چی کار باید کرد؟
اگه توی این dll ای که دادین ، این کار عملی نیست ، توی توابع API ها چجوری میشه همین کار رو کرد؟ (یعنی چجوری میشه کنترل داخل یک پنجره و کانتینر اصلی رو تغییر سایز داد؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
منظورم از پست بالا ، در فایل dll ای که دادین ، هست
یعنی در اون فایل enum ها و کلاس هایی که در پست بالا گفتم ، ساخته شد
 

SajjadKhati

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

کد:
public uint SWP_SHOWWINDOW = 0x0040;
        public uint SWP_NOMOVE = 0x0002;
        public uint SWP_NOSIZE = 0x0001;
        public int HWND_TOP = 0;
        public int HWND_TOPMOST = -1;


        [DllImport("User32.dll", EntryPoint = "SetWindowPos")]
        public static extern bool SetWindowPos(IntPtr hdlControl, int hdlParent, int X, int Y, int width, int height, uint winStat);


private void button10_Click(object sender, EventArgs e)
        {
            foreach (Process process in Process.GetProcesses())
            {
                if (process.MainWindowTitle == "My Project")
                {
                    SystemWindow winApi = new SystemWindow(process.MainWindowHandle);

                    foreach (SystemWindow childWin in winApi.AllDescendantWindows)
                    {
                        if (childWin.ClassName.Contains("Combo"))
                        {
                            bool state = UserControlMp3Player.SetWindowPos(childWin.HWnd, HWND_TOP, 1000, 500, 100, 50, SWP_SHOWWINDOW);
                            if (state==true)
                            {
                                MessageBox.Show(state.ToString());
                            }
                        }
                    }
                }
            }
        }

چی کار میشه کرد؟
 

the_king

مدیرکل انجمن
سلام
استاد علی ، دو تا سئوال دارم :
اول اینکه enum ای بنام WindowExStyleFlags (منظورم WindowStyleFlag نیست) ساخته شد ولی در اعضای کلاس SystemWindow اصلا بکار گرفته نشد (یعنی برگردونده یا خواسته نشد) . پس اگه بخوایم از این enum استفاده کنیم در ویندوزمورد نظرمون ، باید چی کار کنیم؟ (منظورم enum ای که نامش WindowStyleFlag هه ، نیست که در پروپرتی Style در کلاس SystemWindow برگردونده میشه)

مربوط به نحوه تعریف کلاس های کتابخانه است، سعی کرده به اصل منبع وفادار بمونه، API در اصل در ++C تعریف شده اند. در خود ++C برای این مقادیر ثابت مثل WS_EX_ACCEPTFILES یک enum وجود نداره که هر چی مقدار مربوط به Extended Window Styles هست داخلش باشه ، در ++C همینطوری بدون گروه بندی در سطر های پی در پی از const استفاده شده و هر مقدار ثابت دونه دونه و مجزا تعریف شده اند، تحت یک enum خاص جمع نشده اند، برای همین حقیقتا enum ای وجود نداشته که بخواهند پارامتر رو بر روی اون enum خاص تعریف کنند. برای همین شما پارامتر ها رو روی گروه خاصی از enum ندارید.

تایتل پنجره ی من ، "My Project" هه . اطلاعات کنترل ها رو دقیق میتونه بخونه و تغییر نمیتونه بده
در واقع ، با این کد ، اون صفحه ی داخل کمبوباکس (لیست کشویی کمبوباکس) ، اونم پهناش تغییر میکنه ولی من میخوام خود کمبوباکس تغییر سایز بده
چی کار باید کرد؟
اگه توی این dll ای که دادین ، این کار عملی نیست ، توی توابع API ها چجوری میشه همین کار رو کرد؟ (یعنی چجوری میشه کنترل داخل یک پنجره و کانتینر اصلی رو تغییر سایز داد؟
عرض ComboBox ها که کلا بصورت خودکار بر اساس عرض فونت تنظیم میشه، مگر کسی نحوه ترسیم اش رو دستکاری کرده باشه. پیغام هایی که ComboBox (بجز پیغام های عمومی پنجره قبول می کنه) اینها است و با SendMessage به کنترل ارسال می شوند :
ComboBox Control Messages

دوم و مهم تر اینکه من هر کاری میکنم ، در کد زیر ، نمیتونه بعضی از پروپرتی های (مثلا پروپرتی size یا location یا posation) کنترل هایی (مثل کنرل button و کمبوباکس و لیست باکس و هر کنترل دیگه ای) که داخل پنجره ی اصلی مورد نظرم هستن رو دستکاری کنه (set کنه) یا تغییر بده در صورتی که نام کلاس و title و حتی بقیه ی اطلاعاتی که از اون کنترل ها رو میگیرم و get میکنم ، درست برمیگردونه . اما کنترل کانتینر (کانتینر ای که کنترل ها توش هستن) و پنجره اصلی ویندوزم رو میتونه دستکاری کنه (میتونه تغییر سایز و ... بده و اون پروپرتی ها روش کار میکنن)
دلیل اش چیه؟ راهی و کدی داره که کنترل های داخل یه پنجره رو دستکاری کرد؟
شاید Handle کنترل مورد نظر رو در لیست تان ندارید. اما به هر حال کد شما نهایتا یک پیغام به کنترل ارسال می کنه که درخواست تغییر اندازه است، این به اون تابعی که داره پیغام های کنترل رو مدیریت می کنه بستگی داره که با پیغام ارسالی چه برخوردی بکنه، ممکنه جلوی اعمال کردنش رو بگیره، فرضا اگه ابعاد یک کنترل بصورت خودکار بر اساس ابعاد پنجره والد تنظیم میشه، یا صرفا درخواست های پنجره والدش رو قبول کنه. ضمانتی وجود نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی


سلام
استاد علی ، دو تا سئوال دارم :
اول اینکه enum ای بنام WindowExStyleFlags (منظورم WindowStyleFlag نیست) ساخته شد ولی در اعضای کلاس SystemWindow اصلا بکار گرفته نشد (یعنی برگردونده یا خواسته نشد) . پس اگه بخوایم از این enum استفاده کنیم در ویندوزمورد نظرمون ، باید چی کار کنیم؟ (منظورم enum ای که نامش WindowStyleFlag هه ، نیست که در پروپرتی Style در کلاس SystemWindow برگردونده میشه)

اینو من اصلا ندیدم
کلاس SystemWindow یه پروپرتی ای بنام ExtendedStyle داره که از enum مربوطه یعنی WindowExStyleFlags استفاده میکنه که ندیده بودم :wink:
------------------------
میگم استاد علی ، کلا فقط همین dll هست که با native windows ها کار میکنه؟ هر چند همین dll اش هم اعضای غنی ای داره و قدرتمند هه و کار آدمو خیلی آسون میکنه ولی میخواستم بدونم مثلا مایکروسافت خودش یه کلاس این چنینی ننوشت؟
 

the_king

مدیرکل انجمن
میگم استاد علی ، کلا فقط همین dll هست که با native windows ها کار میکنه؟ هر چند همین dll اش هم اعضای غنی ای داره و قدرتمند هه و کار آدمو خیلی آسون میکنه ولی میخواستم بدونم مثلا مایکروسافت خودش یه کلاس این چنینی ننوشت؟
نه، گفتم بهتون، اگه net window functions wrapper. رو تو گوگل جستجو کنید نمونه های زیادی هست. در نظر بگیرید که API ویندوز خیلی بزرگ ئه، منطقی نیست که Wrapper همه شون در یک مجموعه جمع بشه.
وقتی میگید چرا مایکروسافت کلاس اش رو نساخته دارید در مورد Framework ئه NET. صحبت می کنید، یک Framework عمومی که قراره برای زبان های زیادی مورد استفاده قرار بگیره و مختص یک کاربرد خاص هم نیست. باید تا حد امکان جمع و جور و در عین حال کاربردی باشه. تو کتابخانه های Framework باید ضروری ترین، پرکاربرد ترین و عمومی ترین توابع باشند. موردی که خیلی کاربرد محدودی داره یا خیلی تخصصی ئه رو در Framework عمومی قرار نمیدن. مایکروسافت یا هر شرکت دیگه ای هم بود این یک اصول منطقی رو برای Framework رعایت می کرد. این چیزی که شما میخواهید صرفا یک کلاس Wrapper ئه، شاید برای یک توابع خاص اصلا موردی پیدا نشه. ولی به هر حال سایت هایی مثل www.pinvoke.net یا نرم افزار هایی مثل ApiViewer 2004 تعریف DllImport رو براتون می نویسند.
 

SajjadKhati

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

ارتباط لوا و #c با استفاده از ++c

یه سئوال داشتم چون یه اونجا زیاد مربوط نمیشد ، گفتم اینجا بپرسم :
اینکه مگه رشته ها (فرضا توی سی شارپ) ، آرایه ای از کاراکترها نیستن و مگه هر کاراکتری 2 بایت فضا اشغال نمیکنه؟ پس یه آرایه ای از رشته ها اگه داشته باشیم ، باید طول هر عضوش در رم (فضایی که هر عضو از آرایه در رم اشغال میکنه) باید متفاوت باشه . درسته؟ یعنی دقیق همون jagged array میشه که طول هر عضوشون متفاوت هه
ولی توی همون لینک بالا ، چرا هر عضو ، فضای یکسانی اشغال میکنن؟ همه شون 4 بایت (توی سیستم 32 بیتی) اشغال میکنن در صورتی که مقدار اشغال شده در رم ، باید به تعداد کاراکترهای یه رشته بستگی داشته باشه !
چجوری هه قضیه اش؟
 

the_king

مدیرکل انجمن
سلام
ممنون استاد علی
طبق توضیح تون در تاپیک "ارتباط لوا و سی شارپ" در لینک زیر (آخرین پست) :

ارتباط لوا و #c با استفاده از ++c

یه سئوال داشتم چون یه اونجا زیاد مربوط نمیشد ، گفتم اینجا بپرسم :
اینکه مگه رشته ها (فرضا توی سی شارپ) ، آرایه ای از کاراکترها نیستن و مگه هر کاراکتری 2 بایت فضا اشغال نمیکنه؟ پس یه آرایه ای از رشته ها اگه داشته باشیم ، باید طول هر عضوش در رم (فضایی که هر عضو از آرایه در رم اشغال میکنه) باید متفاوت باشه . درسته؟ یعنی دقیق همون jagged array میشه که طول هر عضوشون متفاوت هه
ولی توی همون لینک بالا ، چرا هر عضو ، فضای یکسانی اشغال میکنن؟ همه شون 4 بایت (توی سیستم 32 بیتی) اشغال میکنن در صورتی که مقدار اشغال شده در رم ، باید به تعداد کاراکترهای یه رشته بستگی داشته باشه !
چجوری هه قضیه اش؟
در #C و ++C و ویژوال بیسیک و ... بله، اندازه حافظه ای که رشته اشغال می کنه مستقیما به طول رشته بستگی داره (در بعضی زبان ها مثل پاسکال رشته طول حداکثری مشخصی داره و حافظه ای که برای قرارگیری رشته تخصیص می دهند یک اندازه ثابتی داره). حرف تون در مورد jagged array کاملا صحیحه، ولی اون طول 4 بایت طول خود رشته که نیست، طول اشاره گر رشته است، طول اشاره گر که ربطی به طول رشته نداره، حتی به اینکه به رشته اشاره می کنه یا هر داده دیگه ای ربطی نداره. اشاره گر طولش ثابته، یا 4 یا 8 بایت، حالا چه اشاره گر رشته باشه و چه اشاره گر چیز دیگه ای. تنها دلیلی که طول اشاره گر متفاوت بشه آدرس دهی حافظه است که فعلا 32 بیتی یا 64 بیتی ئه.
IntPtr.Size پارامتر ورودی که نداره بگید اندازه فلان اشاره گر خاص رو می سنجه، طول ثابت همه اشاره گر های حافظه رو اعلام می کنه، کاری به هیچ اشاره گر خاصی یا طول هیچ رشته ای نداره.
و این نکته رو در نظر بگیرید که اشاره گر اطلاعاتی در مورد اندازه حافظه ای که بهش اشاره می کنه نمیده، یعنی وقتی از یک تابعی اشاره گر رشته رو دریافت می کنید تشخیص طول رشته بدون پردازش محتویاتش عملی نیست. عملا متد Marshal.PtrToStringUni کاراکتر به کاراکتر در حافظه پیمایش انجام میده تا بفهمه آخر رشته کجا است، وگرنه در شروع کار نمیدونه با چه اندازه رشته ای سر و کار داره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، میگم الان یه پروژه جدید میسازم و فایل wmp.dll (در پوشه ی system32) رو reference میکنم ، در فضای نام و کلاس WMPLib.WindowsMediaPlayerClass اش هر کاری میکنم که ازش شی بسازم ، نمیشه!
چرا؟!!
ولی همین کار در یه پروژه ی دیگه میشه !! من در هر دو پروژه ، فقط همین فایل wmp.dll رو reference کردم ولی در پروژه ای که موفقیت آمیز بود ، AxWMPLib هم اضافه شد (که تا جایی که یادم میاد اینو reference نکردم و باید با reference کردن همون فایل wmp.dll اضافه شده باشه . الانم هر چی دنبال AxWMPLib.dll میگردم ، نیست)
روی AxWMPLib (در reference) پروپرتیس رو میزنم و مسیر فایل اش رو میگیرم و توی اون پروژه میذارم ولی بازم همون ارور رو میده
حالا نمیدونم توی اون پروژه ، چیز دیگه ای رو reference کردم یا نه و اگه کردم ، ازکدوم پوشه ی ویندوز کردم ! راهنمایی ام میکنین؟
عکس ارورشم پیوست کردم
ممنون
 

پیوست ها

  • 1.JPG
    1.JPG
    36.1 کیلوبایت · بازدیدها: 4

the_king

مدیرکل انجمن
سلام
استاد علی ، میگم الان یه پروژه جدید میسازم و فایل wmp.dll (در پوشه ی system32) رو reference میکنم ، در فضای نام و کلاس WMPLib.WindowsMediaPlayerClass اش هر کاری میکنم که ازش شی بسازم ، نمیشه!
چرا؟!!
ولی همین کار در یه پروژه ی دیگه میشه !! من در هر دو پروژه ، فقط همین فایل wmp.dll رو reference کردم ولی در پروژه ای که موفقیت آمیز بود ، AxWMPLib هم اضافه شد (که تا جایی که یادم میاد اینو reference نکردم و باید با reference کردن همون فایل wmp.dll اضافه شده باشه . الانم هر چی دنبال AxWMPLib.dll میگردم ، نیست)
روی AxWMPLib (در reference) پروپرتیس رو میزنم و مسیر فایل اش رو میگیرم و توی اون پروژه میذارم ولی بازم همون ارور رو میده
حالا نمیدونم توی اون پروژه ، چیز دیگه ای رو reference کردم یا نه و اگه کردم ، ازکدوم پوشه ی ویندوز کردم ! راهنمایی ام میکنین؟
عکس ارورشم پیوست کردم
ممنون
شما نباید یک DLL ئه Native رو با رفرنس اضافه کنید. اون DLL هم ActiveX ئه، باید ویژوال استدیو به عنوان یک COM. ازتون قبولش کنه تا برای اون Ax رو بسازه.
اون Ax ئه که ازش کلاس می سازید، نه خود DLL. مادامی که اون Ax ئه ساخته نشده و در پروژه تون رفرنس نداره، چیزی از محتویات DLL برای NET. تعریف نشده.
یک فرم رو در پروژه تون در حالت طراحی قرار بدید. باید روی پنجره Toolbox در یکی از Tab هایش راست کلیک کنید و ...Choose Item رو انتخاب کنید. زبانه COM Components رو فعال کنید. Windows Media Player رو تیک بزنید یا از دکمه Browse استفاده کنید. تا زمانی که یکبار از اون کنترل موجود در Toolbox استفاده نکنید Ax و رفرنس ایجاد نمیشه.
از توی Toolbox اون کنترل Windows Media Player رو بردارید و روی فرم تان قرار بدهید. حالا اون Ax ئه ساخته شده و رفرنس ایجاد شده، حالا می توانید اون کنترل رو از روی فرم پاک اش کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما نباید یک DLL ئه Native رو با رفرنس اضافه کنید. اون DLL هم ActiveX ئه، باید ویژوال استدیو به عنوان یک COM. ازتون قبولش کنه تا برای اون Ax رو بسازه.
اون Ax ئه که ازش کلاس می سازید، نه خود DLL. مادامی که اون Ax ئه ساخته نشده و در پروژه تون رفرنس نداره، چیزی از محتویات DLL برای NET. تعریف نشده.
یک فرم رو در پروژه تون در حالت طراحی قرار بدید. باید روی پنجره Toolbox در یکی از Tab هایش راست کلیک کنید و ...Choose Item رو انتخاب کنید. زبانه COM Components رو فعال کنید. Windows Media Player رو تیک بزنید یا از دکمه Browse استفاده کنید. تا زمانی که یکبار از اون کنترل موجود در Toolbox استفاده نکنید Ax و رفرنس ایجاد نمیشه.
از توی Toolbox اون کنترل Windows Media Player رو بردارید و روی فرم تان قرار بدهید. حالا اون Ax ئه ساخته شده و رفرنس ایجاد شده، حالا می توانید اون کنترل رو از روی فرم پاک اش کنید.
سلام
ممنون استاد علی
آها نحوه ی قرار دادن (reference کردن) کمپوننت ها فرق داره؟ باید از پنجره ی Toolbox اینها رو اضافه کنیم؟ (با انتخاب ...Choose Item و رفتن به زبانه COM Components) ؟
کلا چند نوع dll داریم ؟ تشخیص اینکه کدوم کامپوننت هه و ... ، توی msdn زده هه؟ و اگه یه نفر ساخت (یعنی اطلاعات توی سایت نباشه) ، نمیشه نوعش رو فهمید؟
 

the_king

مدیرکل انجمن
سلام
ممنون استاد علی
آها نحوه ی قرار دادن (reference کردن) کمپوننت ها فرق داره؟ باید از پنجره ی Toolbox اینها رو اضافه کنیم؟ (با انتخاب ...Choose Item و رفتن به زبانه COM Components) ؟

کمپوننت های ActiveX کلا Native اند برای همین مستقیما با NET. کار نمی کنند، قبلا توضیح دادم که اون Ax یک واسطه بین اینها است که بصورت خودکار ساخته میشه.
کلا چند نوع dll داریم ؟ تشخیص اینکه کدوم کامپوننت هه و ... ، توی msdn زده هه؟ و اگه یه نفر ساخت (یعنی اطلاعات توی سایت نباشه) ، نمیشه نوعش رو فهمید؟
میگیم چند نوع DLL ولی این DLL نیست که چند نوعه؛ استاندارد داخلیشه که فرق می کنه. با ابزار Dependency Walker راحت میشه تشخیص داد.

www.dependencywalker.com
Dependency Walker 2.2

DLL در اصل یک نوع بیشتر نیست، اما توابع و ساختار داخلش با استاندارد های متفاوتی کار می کنند. مثل فایل avi که صوت و تصویر داخلش با Codec های متفاوتی انکود میشه.
ممکنه یک DLL با دو تا استاندارد متفاوت همزمان کار کنه. اگه ویژوال استدیو های قدیمی رو داشته باشید ابزار Dependency Walker رو دارند، خودش هم مستقل قابل دانلود ئه.
میشه انواع فایل های اجرایی یا DLL رو باهاش باز کرد که نشون بده به چه فایل های لینک داده یا توابع خروجیش چیه.
هر چی تابع استاندارد از dll تون export شده باشه اسمشون رو اون برنامه نشون میده که اگه نداشته باشه چیزی نداره که برایش DllImport بنویسید.
برنامه های NET. به MSCOREE.DLL رفرنس دارند که هسته NET. ئه، پس اگه DLL ای رو با Reference اضافه می کنید باید داخلش لینک به MSCOREE.DLL رو ببینید.
ActiveX ها حداقل سه تا تابع ئه Export شده DllRegisterServer و DllUnregisterServer و DllGetClassObject را دارند، چون اگه اینا نباشه نه Register می شوند و نه میشه ازشون کلاس ساخت.
 

پیوست ها

  • depends22_x86.zip
    596.5 کیلوبایت · بازدیدها: 15

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی
یه مطلبی رو می خواستم نظرتون رو بدونم گفتم چون مربوط به سی شارپ هست ، اینجا بگم ولی اگه ربطی نداره پیشاپیش عذر میخوام
اینکه چون سربازی ام نزدیک هه (یکی دوماه دیگه معرفی میکنم و میگن حدود 3 ماه بعدش طول میکشه تا اعزام پس کلا حدودا 4 تا 5 ماه) ، گفتم هر چی از سی شارپ بلدم ، تا قبل از اعزام ، آموزش بدم . هر چند توی سی شارپ مبتدی ام و قطعا خیلی از مطالب رو درست درک نکردم ولی دیگه حتما باید آموزش بدم تا قبل از سربازی . (اگه قضیه ی سربازی نبود ، میذاشتم ، تسلطم بیشتر شه و بعد بگم) . هر چند آموزش مبتدی اما به نظرم برای کسایی که مثل من تازه بخوان یاد بگیرن ، به نظرم باید (حداقل برای شروع) ، آموزش بدی نباشه (حداقل خودم بعد از سربازی ، مطالبی که فراموش کردم رو میبینم)
آموزش سی شارپ هم به نظرم بسیار طول میکشه (شاید حدود بالای 60 تا 70 قسمت) که اگه مدام آموزش داده شه ، حداقل 2 ماه پی در پی و فشرده ، زمان میخواد و اینکه چون آموزش سی شارپ هایی که میبینم ، زیادن (کلا مطالب سی شارپ بسیار زیاده و با این همه ، من فقط اندکی مطالب از سی شارپ بلدم و بسیاری رو بلد نیستم) و سئوال هایی که از شما میپرسم ، روند طولانی ای رو طی میکنه ، باعث میشه من حتی بعضا ، بعضی از مطالبی از سی شارپ که قبل تر یاد گرفتم و یه کم تمرین کردم هم آروم آروم از یاد ببرم

حالا به نظر شما ، بهتر اینه که همه ی آموزش ها رو بذارم برای 2 تا 3 ماه آخر تا یه کم تسلطم بیشتر شه یا اینکه از همین الان ، مطالب اولیه (مثل نوع داده ای و ... که حس میکنم اطلاعات اولیه ی بدی ندارم) رو آموزش بدم؟ یعنی به نظرتون بهتره بصورت پراکنده آموزش داده شه یا فشرده؟ هر کدوم مزایا و معایبی دارن ولی به نظرم آموزش پراکنده ، گزینه ی بهتری باشه . در این صورت اگه تسلطم کافی نبود و بعدا اطلاعاتی اضافه شد (که قطعا این طوره) ، بعدا میتونم توی یه قسمت های بعدی اش ، آموزش تکمیلی رو بدم . (هر چند اگه چند سال هم آموزش سی شارپ رو ببینم و تمرین کنم و پروژه های مختلف بنویسم ، بازم بسیار جا داره ولی این آموزش از سر ناچاری کمبود زمان هست که گفتم ...)
ممنون
 

the_king

مدیرکل انجمن
نظر خاصی ندارم، آموزش میتونه هر کیفیتی داشته باشه، رضایت خودتون و یادگیرنده مطرح ئه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی
عیدتون مبارک باشه
میگم من در کمپوننت Codejock Xtreme Suite Pro ActiveX 13.4.0 (که خودش شامل چندین کمپوننت هست) ، هر قسمت از این ها رو خواستم با استفاده از مثال اش (که بصورت آماده موقع نصب این کمپوننت ، توی پوشه ی نصب اش مثال ها ریخته میشه) استفاده کنم ، گفت که کلاس کمپوننت در رجیستری ثبت نشد. حالا 2 تا سئوال :
اول اینکه من وقتی توی سی شارپ خواستم از کمپوننت اتوات استفاده کنم (فایل dll مربوط به نسخه ی سی شارپ موسوم به assembely.dll شو) ، ازم نخواست که مثل این ، اول تی رجیستری ثبت کنم . نمیدونم شاید توی همون فایل سی شارپ ، در متد سازنده اش ، خودش اتوماتیک ثبت میکرد) . این حدسم درسته؟ اگه نه پس چرا کمپوننت اتوات لازم به ثبت کردن در رجیستری نداشت (با نسخه ی سی شارپ اش)
و دوم اینکه اگه بخوام با استفاده از سی شارپ ، یه کمپوننت ای رو در رجیستری ثبت کنم با چه متد یا کلاسی باید کار کنم؟
ممنون
 

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

بالا