PDA

View Full Version : ساختن فایل DLL در VFOX 9.0



ehsan_zanganeh
پنج شنبه 20 دی 1386, 15:16 عصر
با سلام

ببخشید من VFOX کار نیستم. اما می خواستم بدونم چطور می شه چند Function رو که در یک فایل png هست رو به فایل DLL تبدیل کرد. و حالا به توابع آن دسترسی داشت.

وقتی یک پروژه می سازم و فایل png رو در program شیی می کنم و پروژه رو بصورت
single-hearded COM server(DLL ) builld میکنم پیغام زیر ظاهر می شود :



cannot build a DLL without OLE public classes


لطفا راهنمایی کنید.

ehsan_zanganeh
پنج شنبه 20 دی 1386, 22:17 عصر
کسی نمی تونه کمکی کنه:عصبانی++::گریه:

rezaTavak
جمعه 21 دی 1386, 00:53 صبح
چونکه ساخت یک DLL باید بر اساس یک کلاس مانند شکل زیر باشد:



DEFINE CLASS person AS CUSTOM OLEPUBLIC
FirstName = SPACE(30)
LastName = SPACE(45)
PROCEDURE GetName
RETURN THIS.FirstName + " " + THIS.LastName
ENDPROC
ENDDEFINE
که بعنوان کلاس اصلی است.

ehsan_zanganeh
جمعه 21 دی 1386, 22:25 عصر
با تشکر
خوب حالا من چیکار باید بکنم که این چندتا ، تابع من به یک DLL تبدیل بشه و بتونم به هریک از اونها دسترسی داشته باشم.

ممنون می شم اگه راهنمایی کنید

kia1349
شنبه 22 دی 1386, 07:55 صبح
بهتره اول فاکس پرو کار باشید
بعد همانطور که دوستان گفتند با استفاده از کلاسها dllخود را بسازید
به هر حال فاکس هم قواعد کار خودش را دارد مثل هر نرم افزار دیگه

ehsan_zanganeh
شنبه 22 دی 1386, 16:19 عصر
با سلام

من هم راهنمایی خواستم .
خوب حالا چطور چند تابع رو توی یک کلاس بنویسم

rezaTavak
شنبه 22 دی 1386, 19:10 عصر
دقت کن خط شماره ۴ تا ۶یک پروسیجر است.

مثل آن می توانید تعریف کنید.

اگر نام این پروسیجر INIT باشد در ابتدای ساخت کلاس اجرا خواهد شد.
از این طریق می توانید هر تابعی در هر فایلی را صدا بزنید.

ehsan_zanganeh
شنبه 22 دی 1386, 21:21 عصر
ممنون چکش می کنم. ببینم چیکار می تونم بکنم

rahro
یک شنبه 23 دی 1386, 06:31 صبح
بهتره اول فاکس پرو کار باشید
بعد همانطور که دوستان گفتند با استفاده از کلاسها dllخود را بسازید
به هر حال فاکس هم قواعد کار خودش را دارد مثل هر نرم افزار دیگه
فکر کنم این دوستمان حق داشته باشد! من هم متوجه نشدم !!:عصبانی++:
در کل آیا میشه مجموع فانکشن ها و کلاسها رو با فرمت DLL ذخیره کرده نه VCX فاکس ؟!!

علی اکبر
یک شنبه 23 دی 1386, 07:43 صبح
یه سوال
چه فرقی می کنه dll باشه یا کلاس یا prg من فکر می کنم فایلهای dll فاکس فقط بدرد خود فاکس می خورند ونمی شه اونها رو جای دیگه استفاده کرد یا اگه بخوای استفاده کنی باید runtime فاکس هم باشه
درسته؟؟؟؟؟؟؟

rezaTavak
یک شنبه 23 دی 1386, 09:55 صبح
نه درست نیست.
و باید runtime فاکس باشه. همنطور که در بقیه زبانهای غیر کمپایلی دیگر مانند BASIC یا بهتر بگویم VB هم باید باشد. (msvbvm60.dll فایل رانتایم بیسک است که در office هم وجود دارد. و قبلا بحث کرده ام که تمام توابع و پروسیجرهای بیسیک قابل استفاده در فاکس است.)

dll فاکس از نوع سروری است نه dll معمولی. مثلا میشه توی اکسل با هر جای دیگه استفاده کرد.

به مثالی که در ادامه آمده توجه کنید:

rezaTavak
یک شنبه 23 دی 1386, 09:57 صبح
من می خواهم در اکسل یک تاریخ انگلیسی را به تاریخ فارسی تبدیل کنم.

اما این تابع را در فاکس دارم پس به یک dll تبدیل می کنم و در Excel فرا می خوانم:

۱ - پروژه می سازم که در آن یک فایل prg باشد.

۲ - فایل زیر را از مسیر :
d:\program files\microsoft visual foxpro 9\samples\classes\registry.prg
اضافه میکنم دقت کنید ویندوز من در درایو d است.
۳ - پروژه را dll کمپایل میکنم.
۴ - فایلهای زیر را در مسیر dll مورد نظر قرار می دهم.

GDIPLUS.DLL
msvcr70.dll
msvcr71.dll
VFP9ENU.DLL
vfp9r.dll
VFP9RENU.DLL
vfp9t.dll
۵ - در آخر dll را رحیستر می کنم با regsvr32 مثلا نام farsidate.dll را با دستور زیر :


regsvr32 farsidate.dll
رجیستر کنید.
۶ - حال هر جایی خواستید از این dll استفاده میکنید مثلا در Excel با دستورات زیر در یک ماکرو یا ماژول:


Set oTest = CreateObject("farsidate.farsidate")
cDate$ = oTest.convert("1997/12/12")



یا بیسیک یا ...

rezaTavak
یک شنبه 23 دی 1386, 10:36 صبح
مثالی برای این منظور.


دقت کنید که باید فایلهای runtime در مسیر dll ساخته شده باشد و نیز حتما رجیستر شود.

دو فایل vbr و tlb را هم مد نظر داشته باشید موقع ساخت dll ایجاد می شوند.

فایل excel ساخته شده مثال را اجرا میکند.


بعد از مراحل فوق:

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

alt+F11 را گرفته روی قسمت ماژولها ماژول را نگاه کنید.

ehsan_zanganeh
یک شنبه 23 دی 1386, 22:44 عصر
سلام

اقایون من هنوز جواب خودم رو نگرفتم . لطفا اگه زحمتی نیست یک مثال با همون شرایطی که گفتم بزنید تا مسئله برام روشن شه.

مرسی

ehsan_zanganeh
دوشنبه 24 دی 1386, 00:31 صبح
با تشکر مثالی که در بالا زدید رو تست کردم با کار خودم. دیگه اون خطا رو نمی داد.
ولی حالا مشکل اینه که نمی تونم بهش پارامتر بفرستم.(البته به مثال شما هم نتونستم این کار رو بکنم)

البته این هم بگم که اون DLL هایی رو که شما گفتید رو :
1- نفهمیدم که چی هستن
2- حتما باید اونها باشن تا DLL درست ساخته بشه
3- بدون اون DLL ها هم DLL ساخته شد

بنده این DLL رو در VB.NET اضافه می کنم و تست می کنم. وقتی یک نوع از این DLL می سازم و لیست توابع رو می بینم تمامی توابع رو بدون پارامتر نشون می ده.

rezaTavak
دوشنبه 24 دی 1386, 07:48 صبح
سلام

اقایون من هنوز جواب خودم رو نگرفتم . لطفا اگه زحمتی نیست یک مثال با همون شرایطی که گفتم بزنید تا مسئله برام روشن شه.

مرسی

خب من تابع خودم را گذاشتم شما هم تابع خودتان را می نویسید مشکل دیگر کجاست؟


با تشکر مثالی که در بالا زدید رو تست کردم با کار خودم. دیگه اون خطا رو نمی داد.
ولی حالا مشکل اینه که نمی تونم بهش پارامتر بفرستم.(البته به مثال شما هم نتونستم این کار رو بکنم)

البته این هم بگم که اون DLL هایی رو که شما گفتید رو :
1- نفهمیدم که چی هستن
2- حتما باید اونها باشن تا DLL درست ساخته بشه
3- بدون اون DLL ها هم DLL ساخته شد

بنده این DLL رو در VB.NET اضافه می کنم و تست می کنم. وقتی یک نوع از این DLL می سازم و لیست توابع رو می بینم تمامی توابع رو بدون پارامتر نشون می ده.

مطالب را درست نخواندید:
Runtime یعنی فایل زمان اجرا اون فایلهای runtime Foxpro است.
مثال excel هم توش است.

من توی VB.NET کار نکرده ام (و نخواهم کرد) اما توی Excel مثال را ببین.

ehsan_zanganeh
دوشنبه 24 دی 1386, 19:17 عصر
در DLL شما هم همین مشکل هست که به توابع نمی شه پارامتر داد.

ehsan_zanganeh
دوشنبه 24 دی 1386, 21:12 عصر
مشکل حل شد
به همان صورت بالا توابع خود رو می نویسید . و فقط در تابع اصلی تون این تغییر کوچلو رو می دید


SET PROCEDURE TO code_page
DEFINE CLASS convert_dos2win AS CUSTOM OLEPUBLIC
PROCEDURE Convert(tcDate as String )
RETURN code_page(tcDate)
ENDPROC
ENDDEFINE



یعنی در واقع متغییر یا همون پارامتر رو جلوی PROCEDURE تون می نویسید.
حالا بصورت DLL پروژتون رو build می کنید

سپس اون رو regsvr32 می کنید و توی هر جا که می خواید استفاده کنید (حتی توی VB.NET :چشمک:)

rezaTavak
سه شنبه 25 دی 1386, 07:36 صبح
خب حالا فهمیدم.

مشکل شما این بود که نمی دانستید کلمه کلیدی Parameter یا Lparameter در فاکس برای دادن پارامتر به تابع است. شما به روش بیسیک عمل کردید!

ehsan_zanganeh
جمعه 28 دی 1386, 01:44 صبح
خب حالا فهمیدم.

مشکل شما این بود که نمی دانستید کلمه کلیدی Parameter یا Lparameter در فاکس برای دادن پارامتر به تابع است. شما به روش بیسیک عمل کردید!

خیر بنده این مطلب رو می دونستم. ولی دلیل جواب ندادنش رو نفهمیدم. که با راه دوم جواب داد.
اتفاقا یکبار بصورت Parameter نوشتم و یکبار بصورت Lparameter که باز هم جواب نداد. بنابراین مجبور شدم بصورت vb بنویسم .

به هر حال از راهنمایی های شما خیلی ممنونم.

من برنامه آقای حسینی رو به یک DLL که بشه توی همه جا استفاده کرد. ولی یک نکته داره اونم اینه که باید حتما از odbc vfoxpro استفاده کرد تا اطلاعات رو بدرستی بتونه Convrt کنه