PDA

View Full Version : فراخوانی dll فرترن در دلفی



Zahed2008
یک شنبه 05 آبان 1387, 10:15 صبح
سلام به همه دوستان،
من یه برنامه در دلفی نوشتم که حتماً باید از یک dll نوشته شده در زبان فرترن استفاده کنه.
ولی وقتی اونو فراخوانی می کنم، پیغام می ده که دلفی نمی تونه اونو بارگذاری کنه.
لطفاً منو راهنمایی کنید. متشکرم.:خجالت:

vcldeveloper
یک شنبه 05 آبان 1387, 12:08 عصر
فرقی نمیکنه که DLL با چی نوشته شده باشه. اگر اون DLL از نوع داده خاصی که مخصوص فرترن هست، در پارامترها و خروجی توابعی که export کرده، استفاده نکرده باشه، میشه با هر زبانی اونو لود کرد.
درباره DLLها تاپیک های زیاد با انواع نمونه سورس کد در بخش دلفی وجود داره، جستجو کنید.

Zahed2008
دوشنبه 06 آبان 1387, 15:36 عصر
سلام، ممنون از جوابتون.
dll فرترنی که من ازش استفاده می کنم، از یه سری توابع کتابخانه ای زبان فرترن استفاده می کنه. چطور می تونم این توابع رو به دلفی Import کنم. :لبخندساده:

vcldeveloper
سه شنبه 07 آبان 1387, 02:29 صبح
آیا اون توابع توسط DLL مربوطه export شدند؟ اگر شدند، به چه شکلی در فرترن تعریف شدند؟

Zahed2008
پنج شنبه 09 آبان 1387, 08:49 صبح
سلام، ممنون از جوابتون.
وقتی dll فرترن کامپایل می شه یه فایل کتابخانه ای با پسوند lib از خودش به جا می ذاره.
این dll با استفاده از این فایل lib در Visual Fortran استفاده می شه و جواب می ده. من چطوری می تونم این فایل lib رو به دلفی import کنم. با تشکر و سپاس فراوان.:لبخندساده:

vcldeveloper
پنج شنبه 09 آبان 1387, 11:41 صبح
اون فایل Lib به اون شکل به دلفی Import نمیشه.
ببینید، اگر شما خودتون DLL را در فرترن نوشتید، باید بدونید که چه توابعی در اون قرار دادید، و به چه شکلی باید اون توابع را فراخوانی کرد. اگر هم DLL را خودتان ننوشتید، کسی که آن را انتشار داده، به همراه آن توضیحی درباره توابع موجود در آن (مثل خروجی هر تابع، یا پارامترهای هر تابع) داده است، و براساس اون اطلاعات میشه تابع را فراخوانی کرد.
اگر اطلاعات گفته شده را داشته باشید، اون وقت می تونید اون DLL را در دلفی مثل هر DLL دیگه ایی لود کنید؛ یا بصورت Static یا بصورت Dynamic. درباره لود DLL در دلفی به هر دو صورت در همین بخش تاپیک هایی وجود داره.

Zahed2008
چهارشنبه 22 آبان 1387, 15:02 عصر
با سلام وتشکر از آقای کشاورز،
من بالاخره تونستم یه dll از فرترن فراخونی کنم. فرم نوشتن dll در فرترن مشکل داشت و باید دو خط دوم و سوم عیناً رعایت می شد و به صورت زیر اصلاح شد:

subroutine dllTest(a,b,c)
!Dec$ attribute dllexport, stdcall :: dllTest
!Dec$ attribute refrence :: a,b,c

real :: a(2),b(2),c(2)
c(:)=a(:)*b(:)

return
end subroutine dllTest
ولی نکته ای که هست اینه که وقتی تو دلفی فراخوانی می شه مقدار c که یه مقدار خروجی هستش یه مقدار نامشخص می ده.
فکر می کنید اشکال کار کجاست؟ لازم به تذکر که برای اینکه ورودی دلفی با فرترن بخونه از type زیر برای تعریف تابع استفاده کردم:


type TMX=array[0..1] of single;

...

var procedure dllTest(a,b,c:TMX);stdcall; external 'dllTest.dll' named 'dllTest'
....
لطفاً منو راهنمایی کنید.

vcldeveloper
چهارشنبه 22 آبان 1387, 16:35 عصر
من از Syntax فرترن سر در نمیارم. میشه توضیح بدید که نوع داده real در فرترن به چه شکلی تعریف شده؟
همچنین مفهموم دو خط زیر چی هست؟


real :: a(2),b(2),c(2)
c(:)=a(:)*b(:)
باید دید آیا نوع داده فرترن را میشه در دلفی شبیه سازی کرد یا نه.

Zahed2008
پنج شنبه 23 آبان 1387, 09:32 صبح
سلام،
درباره مفهوم این دو خط باید بگم که:
خط اول تعریف متغیر با یه آرایه از 0 تا 1 (یعنی 2 تا ) از نوع real و خط دوم ضرب دو آرایه به صورت عددی در هم.
ببخشید ممکنه real فرترن با real دلفی فرق کنه؟ مگه همه زبانهای برنامه نویسی پایه شون زبان ماشین یا اسمبلی نیست؟

Zahed2008
پنج شنبه 23 آبان 1387, 15:38 عصر
سلام،
فهمیدم که real فرترن با real دلفی فرق می کنه. یعنی :
real فرترن = single دلفی
real(8 فرترن = Double دلفی یا real
integer فرترن = integer دلفی _ (خدا رو شکر اینها با هم تطبیق دارند)
-------------------------------------------------------------------------------------

Zahed2008
شنبه 25 آبان 1387, 08:42 صبح
سلام به همه دوستان،
من به سایتهای خارجی و داخلی زیادی رجوع کردم، ولی نتونستم جواب سوالم رو بگیرم. که در نهایت به این سایت خوب "برنامه نویس" رسیدم و تونستم که بالاخره یه سابروتین نوشته شده در فرترن رو از طریق دلفی فراخوانی کنم.
از همه دست اندرکاران این سایت علی الخصوص آقای کشاورز تشکر و قدردانی می کنم. اگه فکر می کنید توضیحات بشتری نیاز هستش، می تونم یه مقاله با عنوان "نحوه صحیح فراخوانی dll فرترن در دلفی" تو این سایت بذارم.
**** شاد و پیروز باشید **** :لبخندساده::لبخندساده::لبخن ساده:

samir2253122
شنبه 23 آذر 1387, 22:55 عصر
سلام به همه دوستان،
من به سایتهای خارجی و داخلی زیادی رجوع کردم، ولی نتونستم جواب سوالم رو بگیرم. که در نهایت به این سایت خوب "برنامه نویس" رسیدم و تونستم که بالاخره یه سابروتین نوشته شده در فرترن رو از طریق دلفی فراخوانی کنم.
از همه دست اندرکاران این سایت علی الخصوص آقای کشاورز تشکر و قدردانی می کنم. اگه فکر می کنید توضیحات بشتری نیاز هستش، می تونم یه مقاله با عنوان "نحوه صحیح فراخوانی dll فرترن در دلفی" تو این سایت بذارم.
**** شاد و پیروز باشید **** :لبخندساده::لبخندساده::لبخن ساده:


سلام دوست عزيز
من هم ميخواهم كاري مشابه شما انجام بدهم يعني يك سري برنامه هاي فرترن دارم كه به دليل مزاياي زياد فرترن در محاسبات ميخواهم از آنها در دلفي استفاده كنم. حالا چند سوال دارم چون خيلي به فرترن وارد نيستم.

1- DLL را در فرترن چجوري مينويسيد؟
2- از چه كمپايلري براي فرترن استفاده ميكنيد ؟
3- در صحبتتون از فايل Lib كه در برنامه Fortran PowerStation 4.0 ساخته ميشه صحبت كرديد آيا اين همون DLL هست كه پسوندش عوض شده؟
4-آيا ميشه يك ماتريس عريض و طويل را به طور مستقيم وارد دلفي كرد؟ چون ظاهرا در فرترن خروجي Function ميتونه ماتريس هم باشه ولي دلفي چنين قدرتي را نداره.
5-من در دلفي از extended براي تعريف اعداد اعشاري استفاده ميكردم اون هم معادل داره تو فرترن؟
6-براي اعداد اعشاريم بيشترن دقت ممكن (رقم اعشار) را ميخواهم شما Real را پيشنهاد ميكنيد براي اين منظور ؟ كدام بهترند Real Double Extended‌ ؟

ممنون ميشم مقاله "نحوه صحیح فراخوانی dll فرترن در دلفی" را آماده كنيد كه ممكنه خيلي ها بهش احتياج داشته باشن.
با تشكر

samir2253122
دوشنبه 25 آذر 1387, 09:49 صبح
با سلام وتشکر از آقای کشاورز،
من بالاخره تونستم یه dll از فرترن فراخونی کنم. فرم نوشتن dll در فرترن مشکل داشت و باید دو خط دوم و سوم عیناً رعایت می شد و به صورت زیر اصلاح شد:

subroutine dllTest(a,b,c)
!Dec$ attribute dllexport, stdcall :: dllTest
!Dec$ attribute refrence :: a,b,c

real :: a(2),b(2),c(2)
c(:)=a(:)*b(:)

return
end subroutine dllTest
ولی نکته ای که هست اینه که وقتی تو دلفی فراخوانی می شه مقدار c که یه مقدار خروجی هستش یه مقدار نامشخص می ده.
فکر می کنید اشکال کار کجاست؟ لازم به تذکر که برای اینکه ورودی دلفی با فرترن بخونه از type زیر برای تعریف تابع استفاده کردم:


type TMX=array[0..1] of single;

...

var procedure dllTest(a,b,c:TMX);stdcall; external 'dllTest.dll' named 'dllTest'
....
لطفاً منو راهنمایی کنید.



سلام
من جواب سوال اول و دوم را پيدا كردم ولي كد هايي كه شما نوشتيد را نتوانستم اجرا كنم. يعني فايل DLL ساخته ميشه ولي دلفي هنگام Run خطا ميده.

آيا در فرترن همين كد كافي هست ؟ يعني نبايد چيز ديگري بنويسيم ؟ مثلن Export

samir2253122
دوشنبه 25 آذر 1387, 19:45 عصر
با برنامه compaq visual fortran 6.6 هم دوباره DLL را ساختم باز هم همان خطا را ميده

samir2253122
سه شنبه 26 آذر 1387, 17:44 عصر
اين خط را اگه ننويسم برنامه دلفي اجرا ميشه ولي موقع استفاده از روال خطا ميده




!Dec$ attribute refrence :: a,b,c



كسي نيست كمك كنه؟؟

samir2253122
شنبه 30 آذر 1387, 14:05 عصر
مشكل حل شد يه برنامه Open Source پيدا كردم به زبان دلفي كه خودش كد هاي لازم براي فرترن و دلفي را ميسازه. براي دوستاني كه احتمالن بعدن به اين مشكل بر ميخورند از اينجا (http://sourceforge.net/projects/fiwizard) ميتوانند دريافت كنند.

Zahed2008
دوشنبه 08 تیر 1388, 16:13 عصر
سلام، ببخشيد كه دير جواب مي دم. چونكه اصلا متوجه نشدم چنين سوالهايي مطرح شده:
خط زير براي فرخواني آرايه(Reference) هستش:

!Dec$ attribute refrence :: a,b,c
براي فرخواني يه عدد(Value) بايد به صورت زير باشه:

!Dec$ attribute value:: a,b,c