با سلام
میخواستم بدونم چطور میشه در ویژوال سی پلاس 2005 یک dll (مثل shamsi.dll ) رو وارد کرد و از توابعش استفاده کرد؟
با تشکر
با سلام
میخواستم بدونم چطور میشه در ویژوال سی پلاس 2005 یک dll (مثل shamsi.dll ) رو وارد کرد و از توابعش استفاده کرد؟
با تشکر
آخرین ویرایش به وسیله A_Salimi : چهارشنبه 26 دی 1386 در 00:25 صبح دلیل: عدم تایپ کلمه سی پلاس
آخرین پست من را در این لینک ببینید:
https://barnamenevis.org/showthread.php?t=91154
ضمنا شما باید dll را در فلدر فایل اجرایی قرار دهید .
اگر هم که فایل import library همراه dll نیست باید آن را از طریق توابعی مثل LoadLibrary و GetProcAddress مورد استفاده قرار دهید.
با سلام
دوست عزیز از پاسخ شما ممنونم اما متاسفانه مشکلم برطرف نشد
میخواستم دقیقا مسیری که dll رو در برنامه میشه load کرد رو بگید چون در برنامه ای مثل vb این کار از طریق منوی Project گزینه ی Refernces و حتی در ویژوال 6 از طریق class wizard این کار میسر است
اما مشکلم در 2005 هست
اگه توضیح بیشتری بدید ممنون میشم
برای کامپایل می توانید dll را در فلدر system32 ویندوز کپی کنید و دیگر نیازی به اضافه کردن خود dll به پروژه نیست ، اگر شما سورس dll را داشتید نیاز بود تا آن را به پروژه به صورت dependency اضافه کنید .
اگر فقط فایل dll را دارید به همان روش ذکر شده در پست قبل باید از استفاده کنید. (به صورت run-time)
اگر فایل .h و .lib را دارید برای یک نمونه این صفحه را ببینید:
http://www.cs.uiowa.edu/~cwyman/classes/common/howto/winGLUT.html
سلام دوست عزیز
نه فایل .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);
اما در نهایت جواب نگرفتم. میشه یک راهکار درست و حسابی بگید و بگید که اصلا کارهایی رو که من انجام دادم درست هستند یا نه ؟
با تشکر
آخرین ویرایش به وسیله Nima_NF : پنج شنبه 27 دی 1386 در 00:43 صبح دلیل: مرتب کردن
چرا فونت ها بهم می ریزند؟؟؟؟؟؟؟؟
مطالب را مستقیم در همینجا تایپ کنید نه در word یا نرم افزارهای دیگر. اگر هم در word تایپ می کنید ابتدا در یک notepad کپی کنید و سپس در فروم .
کد ها را هم لطفا در تک کد قرار دهید.
دوست گرامی ،اگر از ابتدا به جای یک خط سوال ، بیشتر و کامل تر مثل حالا توضیح می دادید مطمئنا زودتر به جواب می رسیدید.نه فایل .lib و نه .h هیچکدوم رو ندارم
ببینید این dll رو که میگم همون dll معروف shamsi.dll هست که از آدرس زیر به همراه help کامل دریافتش کردم
بله روش شما کاملا درست هست ، ولی شما باید پس از هر فراخوانی تابع ها چک کنید که آیا کار LoadLibrary و بقیه توابع درست به پایان رسیده است یا نه ، در غیر اینصورت کامپایلر خطایی نمی دهد چون به عهده شماست که چک کنید:اصلا کارهایی رو که من انجام دادم درست هستند یا نه ؟
در هر مرحله نیز با راست کیک بر روی خط کد مورد نظر و run to cursor برنامه را debug کنید و ببینید در کجا مشکل ایجاد می شود ، ببینید که آیا در CString چیزی ریخته می شود یا نه اصلا تابع load نمی شود.
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
}
ضمنا نام تابع را در آرگومان دوم به همان صورت تعریف شده در help بنویسید نه همه با حروف بزرگ و اگر هم جواب نداد نام ان را با _T بنویسید تا یونیکد باشد:
Miladi2Shamsi_Func =(MILADI2SHAMSI)GetProcAddress(dastgire,"Miladi2Sh amsi");
// or use : _T("Miladi2Shamsi")
موفق باشید
آخرین ویرایش به وسیله Nima_NF : پنج شنبه 27 دی 1386 در 01:54 صبح دلیل: تکمیل
[دوست من تا جایی که من کسب اطلاع کردم این dll یک dll معمولی نبود (اکتیوایکس dll )
ولی در هر حال طریقه استفاده از اون رو فهمیدم .
با تشکر از شما
سلام دوستان
اگه میشه طریقه استفاده از shamsidll رو به صورت خیلی روان واسم توضیح بدید .
من تا به حال هیچ باهاش کار نکردم . یعنی اصلا نمی دونم چطور add میشه و غیره
خیلی متشکرم