ورود

View Full Version : حرفه ای: استفاده از DLL به عنوان Refrence



LegendMAR
جمعه 13 مرداد 1391, 19:17 عصر
سلام
نمی دونم سوالم درسته یا نه, من تازه دارم توی C++ برنامه می نویسم, قبلا C# کار کردم, توی C# می تونی یه DLL از کلاس های مورد نیازت بسازی و بعدا توی یه پروژه دیگه از اون استفاده کنی, کلاساشو تو کلاسای جدید به ارث ببری و یا از کلاس ها نمونه بسازی و ...
توی C++ می خوام بدونم این کار رو چطوری باید انجام بدم؟
با تشکر

#target
شنبه 14 مرداد 1391, 04:13 صبح
DLL رو که میسازی توابع (و کلاس و ...) اینطور تعریف میکنی
__declspec(dllexport) int __cdecl F1(int i);
و کدای تابع هم بنویسی

بعد جایی که میخوای استفاده کنی فقط تعریفو میذاری به این صورت
__declspec(dllimport) int __cdecl F1(int i);
همراه DLL که کامپایل کردی ی فایل lib میسازه اونو باید به لینکر بدی که symbol رو ازش بگیره ی راحت راحت اینه که فایل رو تو پوشه lib کامپایلر کپی کنی و داخل کدت اینو بذاری
#pragma comment (lib , "MyDll.lib")

LegendMAR
شنبه 14 مرداد 1391, 16:27 عصر
با سلام

همراه DLL که کامپایل کردی ی فایل lib میسازه اونو باید به لینکر بدی که symbol رو ازش بگیره ی راحت راحت اینه که فایل رو تو پوشه lib کامپایلر کپی کنی و داخل کدت اینو بذاری
#pragma comment (lib , "MyDll.lib")

در این صورت کلاس های برنامه C#‎ می تونن از کلاس مورد نظر ارث بری کنن یا نه؟ و فقط در C++ می تونن از کلاس مورد نظر یا تابع مورد نظر استفاده کنن؟؟؟
در ضمن آیا اگر مثلا یک کلاس ایجاد کنم باید توابعش رو هم به همون صورت معرفی کنم
به عنوان مثال:
__declspec(dllexport) class CSecondAppDialogDlg : public CDialogEx
{
public:
__declspec(dllexport)CSecondAppDialogDlg(CWnd* pParent = NULL);

به این صورت باید باشه یا فقط تعریف اول برای کلاس کافیه دوم اینکه این کار رو باید توی فایل h.* انجام بدم یا cpp.*؟
مورد بعدی اینکه اگر برنامه به صورت یه Win32 App باشه می شه ازش خروجی گرفت یا اینکه دستوری که گفتید لزوما برای فایل های کتابخانه هست؟
با تشکر

#target
شنبه 14 مرداد 1391, 18:56 عصر
آره میشه البته من تا الان DLL سی شارپ امتحان نکردم ولی باید بشه .(برای استفاده از توابع مستقل که نام در Export table وجود داره میتونی از GetProcAddress هم استفاده کنی )
ی نمونه کد فایل DLL :
class __declspec(dllexport) Name
{
public :
void SetNumber(int i){Number = i ; }
int GetX2(){return Number * 2;}
private:
int Number ;
};

و قسمت فایل اجرایی که قرار استفاده بشه
#pragma comment (lib , "MyDLL.lib")

class __declspec(dllimport) Name
{
public :
void SetNumber(int i);
int GetX2();
private:
int Number;
};

#include <iostream>
int main()
{
Name* J = new Name;
J->SetNumber(10);
std::cout << J->GetX2();
delete J;
}