PDA

View Full Version : وارد کردن dll در ویژوال 2005



A_Salimi
چهارشنبه 26 دی 1386, 00:24 صبح
با سلام

میخواستم بدونم چطور میشه در ویژوال سی پلاس 2005 یک dll (مثل shamsi.dll ) رو وارد کرد و از توابعش استفاده کرد؟

با تشکر

Nima_NF
چهارشنبه 26 دی 1386, 00:58 صبح
آخرین پست من را در این لینک ببینید:
http://barnamenevis.org/forum/showthread.php?t=91154

ضمنا شما باید dll را در فلدر فایل اجرایی قرار دهید .
اگر هم که فایل import library همراه dll نیست باید آن را از طریق توابعی مثل LoadLibrary و GetProcAddress مورد استفاده قرار دهید.

A_Salimi
چهارشنبه 26 دی 1386, 11:51 صبح
با سلام

دوست عزیز از پاسخ شما ممنونم اما متاسفانه مشکلم برطرف نشد

میخواستم دقیقا مسیری که dll رو در برنامه میشه load کرد رو بگید چون در برنامه ای مثل vb این کار از طریق منوی Project گزینه ی Refernces و حتی در ویژوال 6 از طریق class wizard این کار میسر است
اما مشکلم در 2005 هست
اگه توضیح بیشتری بدید ممنون میشم

Nima_NF
چهارشنبه 26 دی 1386, 18:51 عصر
برای کامپایل می توانید dll را در فلدر system32 ویندوز کپی کنید و دیگر نیازی به اضافه کردن خود dll به پروژه نیست ، اگر شما سورس dll را داشتید نیاز بود تا آن را به پروژه به صورت dependency اضافه کنید .

اگر فقط فایل dll را دارید به همان روش ذکر شده در پست قبل باید از استفاده کنید. (به صورت run-time)
اگر فایل .h و .lib را دارید برای یک نمونه این صفحه را ببینید:
http://www.cs.uiowa.edu/~cwyman/classes/common/howto/winGLUT.html (http://www.cs.uiowa.edu/%7Ecwyman/classes/common/howto/winGLUT.html)

A_Salimi
چهارشنبه 26 دی 1386, 23:02 عصر
سلام دوست عزیز

نه فایل .lib و نه .h هیچکدوم رو ندارم
ببینید این dll رو که میگم همون dll معروف shamsi.dll هست که از آدرس زیر به همراه help کامل دریافتش کردم

http://files.oxinsoft.com/shamsidll/shamsidll.zip

من سعی کردم از روشهایی واسه بارگذاری این dll استفاده کنم اما حتی با اینکه در برنامه خطایی وجود نداشت درست عمل نکرد (ضمنا من dll رو رجیستر هم کردم و اون رو در پوشه سیستم هم قرار دادم)

حالا من روش کارم رو واسه شما توضیح میدم اگه در بعضی جاها کارهای عجیب غریبی کردم من رو ببخشید و به من نخندید چون این تجربه اولم بود

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

در ادامه سعی کردم تابع Miladi2Shamsi مربوط به dll رو تعریف کنم : یعنی نوع متغیری به نام MILADI2SHAMSI را تعریف کردم که آدرس تابعی را نگهداری می کند که از نوع CString را برمی گرداند و پارامتری از نوع CString دارد دستور بعدی هم متغیری به نام Miladi2Shamsi و از نوع MILADI2SHAMSI تعریف کردم. این کد ها را در فایل Dlg.cpp برنامه قرار دادم



typedef CString(*MILADI2SHAMSI)(CString);
MILADI2SHAMSI Miladi2Shamsi ;


در OnInitDialog هم کدهای زیر رو نوشتم :



dastgire=LoadLibrary(_T("shamsi.DLL"));

Miladi2Shamsi=(MILADI2SHAMSI)GetProcAddress(dastgi re,"MILADI2SHAMSI");



یک دکمه و دو Edit text با متغیر هایی از نوع cstring به نامهای shams و milad تعریف کردم و کدهای زیر رو در تابع دکمه قرار دادم :





UpdateData();
shams=Miladi2Shamsi(milad);

UpdateData(FALSE);



اما در نهایت جواب نگرفتم. میشه یک راهکار درست و حسابی بگید و بگید که اصلا کارهایی رو که من انجام دادم درست هستند یا نه ؟

با تشکر

A_Salimi
چهارشنبه 26 دی 1386, 23:09 عصر
چرا فونت ها بهم می ریزند؟؟؟؟؟؟؟؟:عصبانی++:

Nima_NF
پنج شنبه 27 دی 1386, 01:02 صبح
چرا فونت ها بهم می ریزند؟؟؟؟؟؟؟؟:عصبانی++:
مطالب را مستقیم در همینجا تایپ کنید نه در word یا نرم افزارهای دیگر. اگر هم در word تایپ می کنید ابتدا در یک notepad کپی کنید و سپس در فروم .
کد ها را هم لطفا در تک کد قرار دهید.


نه فایل .lib و نه .h هیچکدوم رو ندارم
ببینید این dll رو که میگم همون dll معروف shamsi.dll هست که از آدرس زیر به همراه help کامل دریافتش کردم دوست گرامی ،اگر از ابتدا به جای یک خط سوال ، بیشتر و کامل تر مثل حالا توضیح می دادید مطمئنا زودتر به جواب می رسیدید.


اصلا کارهایی رو که من انجام دادم درست هستند یا نه ؟ بله روش شما کاملا درست هست ، ولی شما باید پس از هر فراخوانی تابع ها چک کنید که آیا کار LoadLibrary و بقیه توابع درست به پایان رسیده است یا نه ، در غیر اینصورت کامپایلر خطایی نمی دهد چون به عهده شماست که چک کنید:



hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
Miladi2Shamsi_Func = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1");
if ( ! Miladi2Shamsi_Func )
{
// handle the error FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
// something else
}



در هر مرحله نیز با راست کیک بر روی خط کد مورد نظر و run to cursor برنامه را debug کنید و ببینید در کجا مشکل ایجاد می شود ، ببینید که آیا در CString چیزی ریخته می شود یا نه اصلا تابع load نمی شود.

ضمنا نام تابع را در آرگومان دوم به همان صورت تعریف شده در help بنویسید نه همه با حروف بزرگ و اگر هم جواب نداد نام ان را با _T بنویسید تا یونیکد باشد:



Miladi2Shamsi_Func =(MILADI2SHAMSI)GetProcAddress(dastgire,"Miladi2Shamsi");
// or use : _T("Miladi2Shamsi")

موفق باشید

A_Salimi
جمعه 28 دی 1386, 19:42 عصر
[دوست من تا جایی که من کسب اطلاع کردم این dll یک dll معمولی نبود (اکتیوایکس dll )
ولی در هر حال طریقه استفاده از اون رو فهمیدم .
با تشکر از شما

3pahvand
یک شنبه 05 اردیبهشت 1389, 08:56 صبح
سلام دوستان
اگه میشه طریقه استفاده از shamsidll رو به صورت خیلی روان واسم توضیح بدید .
من تا به حال هیچ باهاش کار نکردم . یعنی اصلا نمی دونم چطور add میشه و غیره
خیلی متشکرم