Moharram
یک شنبه 18 آذر 1386, 16:56 عصر
سلام
برای فراخوانی تابعهای یک DLL دو روش وجود داره (استاتیک - دینامیک)
1- اگه فایل dll و lib کنار هم موجود باشند در برنامه کنسولی فایل lib رو به فایلهای پروژه Add میکنیم و توابع رو صدا میزنیم ولی اگه برنامه دیالوگی باشه نمیدونم چرا این روش کار نمیکنه.
2- اگه فقط فایل DLL رو داشته باشیم میشه با استفاده از کدهای زیر تابع را صدا زد:
فرض میکنیم تابع بشکل ()void fnMyDLL باشه...
HINSTANCE hDLL = LoadLibrary("myDLL.DLL");
if(hDLL==NULL) AfxMessageBox("Cannot Load Library");
FARPROC fp = GetProcAddress(hDLL,"fnMyDLL");
if(fp==NULL) AfxMessageBox("Cannot find function");
int x=fp();
در موردی که مثل بالا تابع پارامتر نداشته باشه مشکلی نیست و تابع اجرا میشه ولی اگه تابع بخواد یه پارامتر داشته باشه باید همانطور که در MSDN آمده بجای قسمت fp اینجوری عمل کنیم:
در این مورد فرض میکنیم تابع یک مقدار int میگیره و یک مقدار int برمیگردونه...
typedef int (CALLBACK* fnMyDll_Type)(int);
fnMyDll_Type fnMyDll_ptr
fnMyDll_Ptr = (fnMyDll_Type)GetProcAddress(hDLL,"fnMyDLL");
if(fnMyDll_Ptr == NULL) AfxMessageBox("Cannot Find Function");
int x = fnMyDll_ptr(10);
تا اینجای کار تابع اجرا میشه، حتی وقتی با اسمبلی دیباگ میکنیم مقدار درستی برمیگردونه ولی یک Error در مورد Stack میده ...
برای فراخوانی تابعهای یک DLL دو روش وجود داره (استاتیک - دینامیک)
1- اگه فایل dll و lib کنار هم موجود باشند در برنامه کنسولی فایل lib رو به فایلهای پروژه Add میکنیم و توابع رو صدا میزنیم ولی اگه برنامه دیالوگی باشه نمیدونم چرا این روش کار نمیکنه.
2- اگه فقط فایل DLL رو داشته باشیم میشه با استفاده از کدهای زیر تابع را صدا زد:
فرض میکنیم تابع بشکل ()void fnMyDLL باشه...
HINSTANCE hDLL = LoadLibrary("myDLL.DLL");
if(hDLL==NULL) AfxMessageBox("Cannot Load Library");
FARPROC fp = GetProcAddress(hDLL,"fnMyDLL");
if(fp==NULL) AfxMessageBox("Cannot find function");
int x=fp();
در موردی که مثل بالا تابع پارامتر نداشته باشه مشکلی نیست و تابع اجرا میشه ولی اگه تابع بخواد یه پارامتر داشته باشه باید همانطور که در MSDN آمده بجای قسمت fp اینجوری عمل کنیم:
در این مورد فرض میکنیم تابع یک مقدار int میگیره و یک مقدار int برمیگردونه...
typedef int (CALLBACK* fnMyDll_Type)(int);
fnMyDll_Type fnMyDll_ptr
fnMyDll_Ptr = (fnMyDll_Type)GetProcAddress(hDLL,"fnMyDLL");
if(fnMyDll_Ptr == NULL) AfxMessageBox("Cannot Find Function");
int x = fnMyDll_ptr(10);
تا اینجای کار تابع اجرا میشه، حتی وقتی با اسمبلی دیباگ میکنیم مقدار درستی برمیگردونه ولی یک Error در مورد Stack میده ...