نقل قول: مجتبی جان شما خودت تاحالا از کامپوننت های .Net تو VB6 استفاده کردی ؟
آره, مشکلی نداره
فقط بايد از قسمت Properties > Compile گزينه register for com interop رو فعال کنی
بعد از کامپايل يه فايل tlb هم کنار کامپوننت ايجاد ميشه که با vb6 بايد اين فايل رو به References پروژه ات اضافه کنی.
آره چه بهتر با يه زبان native انجام بشه اما من به اين دليل گفتم vb.net چون زبان پايه يکی هست
سلام.
شما حتی کامپوننت گرافیکی ( منظور کامپوننتی که روی فرم دیده بشه ) که با .net نوشته شده باشه رو هم میتونی در vb6 استفاده کنی.
فقط همون طور که مجتبی گفت تنظیمات داره. مثلا تو c# تا اون جا که یادمه باید com visibleش رو true میکردیم.
کد مالتی ترد هم که گذاشتم کار میکنه. برای من کرش نمیکنه. برنامه رو کامپایل میکنم یکیشون کرش میکنه.
به هر حال وقتی فایل اولیه کار میکنه پس باید بشه مشکل رو حل کرد.
سلام .
نقل قول: کد مالتی ترد هم که گذاشتم کار میکنه. برای من کرش نمیکنه. برنامه رو کامپایل میکنم یکیشون کرش میکنه.
به هر حال وقتی فایل اولیه کار میکنه پس باید بشه مشکل رو حل کرد.
پیمان جان واسه من کرش کرد ، فکر می کنم باید دور VB6 رو واسه Multi Threading خط بکشیم ، در بهترین حالت بازم درصد ریسک خیلی بالاست !
بهترین راه اینه که یک ActiveX با Delphi یا هر کامپایلر Native دیگه ای نوشته بشه و ازش تو VB6 استفاده کنیم .
نقل قول: آره, مشکلی نداره
فقط بايد از قسمت Properties > Compile گزينه register for com interop رو فعال کنی
بعد از کامپايل يه فايل tlb هم کنار کامپوننت ايجاد ميشه که با vb6 بايد اين فايل رو به References پروژه ات اضافه کنی.
مجتبی جان یه مشکل دارم ، وقتی کلاس رو Build می کنم Dll ساخته شده تو .Net درست کار میکنه ، اما TLB تو VB6 کار نمیکنه (رفرنسش اضافه میشه اما هیچ متود یا... از کلاس قابل دسترس نیست !) .
در ضمن فایل TLB فقط تو پوشه Debug ساخته میشه و تو پوشه Release خبری ازش نیست !
هم با C# تست کردم هم با VB.Net
یه پروژه ساده هم واسه تست ضمیمه کردم .
راستی اگه VB6 هم به سادگی .Net از مولتی ترد و ... پشتیبانی می کرد چفدر خوب می شد
کد:
Dim MyThread As New System.Threading.Thread(AddressOf MySub)
MyThread.Start()
MyThread.Abort()
MyThread.Sleep ()
MyThread.Suspend ()
MyThread.Abort ()
MyThread.Join ()
System.Threading.Thread MyThread = new System.Threading.Thread(MySub)
MyThread.Start();
MyThread.Abort();
MyThread.Sleep ();
MyThread.Suspend ();
MyThread.Abort ();
MyThread.Join ();
يادم رفته بود اين رو هم بگم که تگ ComClass رو هم بايد اضافه کنيد
کد:
<Microsoft.VisualBasic.ComClass()> Public Class Vb9Class1
Public Sub M(ByVal strA As String)
MsgBox(strA)
End Sub
End Class
نقل قول: فایل TLB فقط تو پوشه Debug ساخته میشه و تو پوشه Release خبری ازش نیست !
تو 2008 مشکلی نداره با Rebuild هم امتحان کن
نقل قول: راستی اگه VB6 هم به سادگی .Net از مولتی ترد و ... پشتیبانی می کرد چفدر خوب می شد
از اين ساده تر هم هست
کد:
System.Threading.ThreadPool.QueueUserWorkItem(AddressOf MySub, Nothing)
سلام .
نقل قول: نقل قول :
فایل TLB فقط تو پوشه Debug ساخته میشه و تو پوشه Release خبری ازش نیست !
تو 2008 مشکلی نداره با Rebuild هم امتحان کن
من از VS 2010 استفاده می کنم ، این مشکل همچنان وجود داره .
یه مشکل دیگه هم هست ، من باید یک متود واسه ایجاد ترد بنویسم که نام تابع رو به عنوان ورودی دریافت کنه ، اما مشکل اینجاست که نمیدونم پارامتر ورودی رو چطوری تعریف کنم ، به دو صورت زیر هم نوشتم اما فایده نداره :
کد:
Public Sub CreateNewThread(ByVal procName As System.Threading.ThreadStart)
Dim MyThread As New System.Threading.Thread(AddressOf procName)
MyThread.Start()
End Sub
Public Sub CreateNewThread(ByVal procName As System.Threading.ParameterizedThreadStart)
Dim MyThread As New System.Threading.Thread(AddressOf procName)
MyThread.Start()
End Sub
procName رو باید از چه نوعی تعریف کنم که تو VB6 نام تابع رو به عنوان ورودی قبول کنه ؟
تردها هیچ وقت نام تابع رو به عنوان ورودی دریافت نمیکنن
بلکه ادرس اون تابع رو به عنوان ورودی دریافت میکنن
سلام .
مبین جان در توابع بالا وقتی آدرس تابع رو میفرستم ، با خطای عدم تطابق نوع (Type Mismatch) مواجه میشم .
دوستان در کد بالا procName رو باید از چه نوعی تعریف کنم که تو VB6 آدرس تابع رو به عنوان ورودی قبول کنه ؟
ادرس منظورش همون pointer هست که ادرس حافظه هست که یک مقدار عددی 32 بیتی هست
تو vb6 فکر کنم long در نظر میگیرن
فکر کن میخواهی با GetProcAddress ادرس تابع رو بدست بیاری
مبین جان قبلا نوع Long رو امتحان کردم ، تو .Net نوعش همونطور که تو پست قبلیم نوشتم باید System.Threading.ThreadStart باشه ، وقتی نوعش رو Long انتخاب می کنم خطای غیر قابل تبدیل بودن ایجاد میشه .