PDA

View Full Version : ساخت dll در win32



meysamg_alone
چهارشنبه 19 فروردین 1388, 22:15 عصر
سلام
من یه تازه کارم .
تویه ویژوال سی وین32 exe با تابع WinMain شروع میشه من میخواستم بدونم که تویه win32 dll با چه تابعی شروع میشه و تعریف تابع به چه شکل چه include یا چیز هایی باید بالاش تعریف بشه تا یه dll ساده نوشته بشه (هدف نوشتن dll هست که هم تویه vc هم تویه زبون های دیگه بشه ازش استفاده کرد کلا یه توضیع بدین ممنون میشم)

Nima_NF
پنج شنبه 20 فروردین 1388, 00:40 صبح
یک پروژه win32 project بسازید و سپس در wizard ظاهر شده نوع برنامه را dll تعیین کنید. به این شکل کدهای مورد نیاز ساخته می شود.

هر dll یک تابع با نام DllMain دارد، که شما در آن از طریق switch چند پسام پیش فرض را در صورت نیاز پردازش می کنید (هنگام لود شدن، هنگام متصل شدن به برنامه های دیگر و ...) در هر حال همانند winmain نیست و کدهای اصلی که صادر می کنیم در آن نوشته نمی شود.
مثال در مورد DllMain (http://msdn.microsoft.com/en-us/library/aa370448%28VS.85%29.aspx)

کلا در dll ها کد های ما به صورت تابع های جداگانه نوشته می شوند و جلوی آن ها __declspec(dllexport) می نویسیم تا آن تابع صادر شود. هدر فایل خاصی نیاز نیست include شود، هرگاه از تابع خاصی استفاده کردید که هدر فایل خاصی می خواست آن را همانند برنامه های exe اضافه کنید.




__declspec(dllexport)




BOOLEAN WINAPI DllMain( IN HINSTANCE hDllHandle, IN DWORD nReason,
IN LPVOID Reserved ) ;

قبلا زیاد بحث شده:
http://barnamenevis.org/forum/showthread.php?t=35827
http://barnamenevis.org/forum/showthread.php?t=118223

در این تاپیک نیز توضیحات دیگری در مورد dll هاداده ام:
http://barnamenevis.org/forum/showthread.php?t=139660&page=2

meysamg_alone
پنج شنبه 20 فروردین 1388, 11:00 صبح
سلام از توضیع هاتون ممنونم
یه سوال دیگه
تویه dll میشه روال تعریف کرد و به اون روال متغیر فرستاد ؟
یعنی کسی که داره از dll استفاده میکنه یه تابع هایی رو هم به عنوان روال dll بتونه تعریف کنه و من موقعی که لازم بود اون روال ها را اجرا کنم ؟

Nima_NF
پنج شنبه 20 فروردین 1388, 18:09 عصر
مثلا چه روال هایی ؟

مثلا شما می توانید در یک dll یک dialog به صورت resource داشته باشید، و برای آن هم باید یک procedure تعریف کنید، پس شدنی هست. در dll می توانید آن را فراخوانی و استفاده کنید.
اما اگر منظور شما دریافت پیام ها هست، چون خارج از procedure اصلی پنجره هست باید خودتان کدی بنویسید که پیام ها را دریافت کند و پردازش کند.

meysamg_alone
پنج شنبه 20 فروردین 1388, 22:24 عصر
خو حالا اگه بخواهیم به روال همون فرمی که داخل dll قرار داده شده دست رسی داشته باشیم از تویه برنامه یعنی از تویه exe که داره اون dll را اجرا می کنه دست رسی داشته باشیم چه جوری هست
یعنی فرمی که داخل dll هست نشون داده میشه می خوایم روال
WM_CREATE رو داخل EXE داشته باشیم امکانش هست یا نه ؟

Nima_NF
جمعه 21 فروردین 1388, 01:26 صبح
می توانید از Subclass procedure توسط SetWindowLong یا SetWindowLongPtr استفاده کنید، مثلا در هر جایی از کدها که از dll استفاده می کند کد زیر را فراخوانی کنید: (فلگ DWL_DLGPROC برای دیالوگ ها و GWL_WNDPROC برای پنجره ها)



WNDPROC wndOldProc = (WNDPROC) SetWindowLong(hwndDlg,
GWL_WNDPROC, (LONG) NewDlgProc );

فقط برای کد فوق باید HWND برای دیالوگ را از داخل dll دریافت کنید (مثلا با فراخوانی تابعی)

به این شکل procedure قبلی را به جدید (در مثال NewDlgProc) تغییر می دهید(با حفظ پردازش های قبلی).

سپس این تابع را تعریف کنید:



LRESULT APIENTRY NewDlgProc( HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_CREATE)
// Do something

return CallWindowProc(wndOldProc, hwnd,
uMsg, wParam, lParam);
}

داخل آن پیام های لازم را پردازش کنید و در پایان CallWindowProc را فراخوانی کنید تا بقیه پیام های تعریف شده کار قبلی خود را انجام دهند.