PDA

View Full Version : سوالی در مورد dll



n4r30s
شنبه 04 مهر 1388, 15:44 عصر
دوستان عزیز یک سوال برای من پیش اومده در مورد dll ها و با یک مثال توضیح میدم که درست تونسته باشم منظورم رو بیان کنم .

فرض کنید که یک dll ساختیم که در یک برنامه دیگه ای غیر خانواده C ازش استفاده میکنیم مثل نرم افزارهایی که از اسکریپتها استفاده میکنند . حالا توی این dll ما مثلا 2 تا فانکشن داریم ما با فانکشن اولی محتوای دو متغیر به نام های x و y رو به dll می فرستیم که در این فانکشن این دو متغیر رو با هم جمع میکنه حالا در اون اسکریپی که نوشتم تابع دوم رو فراخوانی میکنیم سوال اینه که آیا تابع دومی میتونه از نتیجه تابع اولی یعنی جمع دو متغیر بالا استفاده کنه ؟ بدون اینکه ما در ورودی تابع دومی استفاده کنیم ؟
یعنی اینکه دو تا متغیر رو در ورودی تابع اولی بدیم که در فایل dll محاسباتی روی این دو تا متغیر انجام بده و بعد وقتی تابع دوم رو فراخوانی میکنیم از اون متغیر تابع اولی استفاده کنه ؟

این کد رو ببینید :



#import "test.dll"
void fun1(double& a0[], double& a1[], double& a2[]);
void fun2(int a0, int& a1[], int a2);
#import


int start()
{
...
fun2(b1, b2, b3);
fun1(c1, c2, c3);
...
}



آیا این توابع تاثیری روی متغیرهای b و c داره ؟ یعنی اینکه بدون اینکه تابع مقدار برگشت داشته باشه چطور میتونه با این اسکریپت ارتباط برقرار کنه ؟

امیدوارم منظورم رو تونسته باشم برسونم هر چند که فکر نکنم و توضیحش برام سخت بود .

با تشکر

Nima_NF
شنبه 04 مهر 1388, 19:08 عصر
همانطور که احتمالا می دانید dll یک تابع اصلی تحت عنوان DllMain دارد، لذا قبل از آن می توانید متغیرهای مورد نظر خود را به صورت عمومی تعریف کنید تا در کل توابع dll مشترک باشد. این راحت ترین راه حل هست.

اگر می خواهید همیشه برای هر thread پروسه ای که آن را لود می کند هر متغیر متفاوت باشد، می توانید از Thread Local Storage استفاده کنید (توابع TlsAlloc و TlsSetValue و TlsGetValue و ...)
چند نمونه مثال هم در این لینک (http://msdn.microsoft.com/en-us/library/ms686997%28VS.85%29.aspx)

n4r30s
شنبه 04 مهر 1388, 21:18 عصر
ممنون از پاسختون حالا سوال اینه که آیا میشه متغیرهای عمومی بین dll و برنامه ای که از dll استفاده میکنه ایجاد کرد ؟ البته بدون استفاده از ورودی و خروجی ؟

البته متاسفانه من برنامه نویس ماهری نیستم فقط اسکریپتهایی در زبان mql می نویسم و تا حد ساده ای زبان C رو بلدم که فقط محاسباتی ساده انجام بدم .

Nima_NF
یک شنبه 05 مهر 1388, 13:06 عصر
احتمالا مثالی که در پست قبل گذاشتم را اصلا نگاه نکردید...
در همان مثال با استفاده از تابع TlsGetValue در تابع main اصلی برنامه اطلاعات دریافت شده و استفاده شد.

ضمنا یک تست کنید و متغیرهای عمومی تعریف شده در dll را با کلمه extern در برنامه اصلی استفاده کنید، باید به این شکل هم قابل دسترسی باشند.