ايران ويج

نسخه‌ی کامل: نوشتن و استفاده از DLL
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4
سلام

میخواستم نحوه ی نوشتن DLL و استفاده ازش ، و طریقه ی استفاده ار API ویندوز در C یا c++ رو بدون به چه طزیق ایجاد میشه و آیا اینکه c از اکتیو ایکس ها پشتیبانی میکنه یا نه ؟ (یعنی میشه از فایل14.ocx تو برنامه استفاده کرد یا نه ؟) اگه میشه، با اعلان چه دستوری

ممنون
از توابع api میتونین به راحتی و به صورت مستقیم استفاده کنین فقط باید header مخصوص به اون گروه توابع رو include کنی
مثلا این یه نمونه خیلی ساده هست که عنوان پنجره مدیاپلیر رو عوض میکنه

کد:
#include <windows>

int main()
{

    HWND hChange;

    while (1)
    {
        hChange = FindWindow(0, "Windows Media Player");
        SetWindowText(hChange, "Pimp it, live it");
    }
    return 0;
}
برای ساخت یک DLL بهتره از ++VC استفاده کنی :

اول از منوی File قسمت New رو می زنی بعد قسمت Win32 Dynamic Link Libarary انتخاب می کنی

یه اسم برای پروژت انتخاب می کنی بعد OK رو می زنی و بعد An Empty DLL رو انخاب و Ok می کنی

بعد توی پروژه یه فایل C++ Source File با نام پروژت اضافه می کنی و توی اون کدهای مورد نظرت رو می نویسی

بعدا بازم یک فایل C++ Souce File ولی ایندفعه با پسوند def به پروژه اضافه می کنی و اطلاعات DLL رو توی اون می نویسی :

کد:
LIBRARY ProjectName
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
/////////////////
Function1
Function2
.
.
.
Function n
/////////////////

به جای ProjectName هم نام پروژت رو می ذاری

و به جای Function می تونی توابعی که می خوای توسط برنامه های دیگه از DLL فراخوانی بشه

رو می ذاری

البته می تونی این اطلاعات رو تغییر بدی

===============================================

حالا دیگه فراخوانی این DLL با بقیه فرق داره و توی هدرها نیست

قبل از فراخوانی باید DLL رو ثبت کنی (با دستور regsvr32)

اول یک هندل تعریف می کنی :

کد:
HINSTANCE dhandle;

که اینجا dhandle هندل ما می شه

بعد باید dll رو لود کنی

کد:
dhandle=LoadLibrary("DllName.dll");

DllName اسم Dll است و اگه نتونه بالا بیاد null برمی گردنه

بعد باید آدرس هر تابع رو بدست بیاری

کد:
Fvar=(FVAR)GetProcAddress(dhandle,"Fvar");

Fvar همون اسم تابع است که می خوای از توی dll استفادش کنی

dhandle هم همون هندل dll ه

برای استفاده از این توابع هم می تونی با همون Fvar کار کنی :

کد:
var=Fvar(Ps);

var یک متغیره که مقدار بازگشتی Fvar رو می گیره و Ps هم همون پارامترهای تابع Fvar هستند
(۱۴-دى-۱۳۸۷, ۲۰:۲۶:۱۱)lord_viper نوشته است: [ -> ]از توابع api میتونین به راحتی و به صورت مستقیم استفاده کنین فقط باید header مخصوص به اون گروه توابع رو include کنی
مثلا این یه نمونه خیلی ساده هست که عنوان پنجره مدیاپلیر رو عوض میکنه

کد:
#include <windows>

int main()
{

    HWND hChange;

    while (1)
    {
        hChange = FindWindow(0, "Windows Media Player");
        SetWindowText(hChange, "Pimp it, live it");
    }
    return 0;
}

یعنی به همین راحتی توابع api که تو وی بی استفاده می کردیم اینجا هم استفاده میشه !! چه خوب !
این کدی رو که گذاشتی من نمیتونم اجرا کنم. ارورش اینه :
'FindWindowW' : cannot convert parameter 2 from 'const char [21]' to 'LPCWSTR'
همین خطا رو برای setwindowtext هم میده
در ضمن فکر می کنم فایل هدرش windows.h باشه.
سلام

ممنون که جواب دادین ، هنوز امتحان نکردم ؛ امتحان میکنم امروز ، انشالله مشکلی نباشه ..

نحوه استفاده dll هایی که ثبت نشدن به چه شکل هست ؟ مثلان میخوام یک dll کنار فایل برنامه بزارم ، و بدون اینکه ثبت کنمش تو برناتمه ازش استفاده کنم


و این dll که نوشتید ، میتونم تو برنامه های دیگه ازش استفاده کنم ؟؟

ممنون که پاسخ میدید
spider جان من خیلی راحت به همین شکل تو codeblocks ازش استفاده کردم
فکر کنم اگه DLL کنار برنامه باشه بدونه اینکه ثبتش کنی بشه ازش استفاده کرد

حداقل ActiveX ها که اینطورین

اگه توابع موجود در DLL رو بدونی به راحتی می شه توی هر برنامه استفادش کنی
سلام
در ادامه صحبت دوستان و در مورد اون اررور، در کامپایلرهای جدید ماکروسافت API ها بطور پیشفرض از نوع یونیکدن
برای همین یا باید پارامترهایی که تو API استفاده میشن یونیکد باشن مثلا رشته ها اولشون یه L اضافه میشه،
اینجوری:
کد:
...
...
hChange = FindWindow(0, L"Windows Media Player");
SetWindowText(hChange, L"Pimp it, live it");
...
...

یا راه دیگه یونیکد پیشفرض api ها نباشه به این صورت که ابتدای کدت این دستور رو وارد کن
(یا داخل تنظیمات پروژت غیر فعالش کنی)

کد:
#undef UNICODE
#undef _UNICODE

در مورد DLL هم که جناب yeketaz توضیح کامل دادن، فقط یک نکته که dll احتیاج به
ثبت نداره چه کنار برنامه باشد چه در جای دیگه قرار داشته باشد

شاد باشد
اینا می دونستم که اگه کنار برنامه باشه نیازی به ثبت نیست ولی فکر کنم اگه جای دیگه ای باشه باید ثبت بشه

اونا DLL ها زبانها دات نت هستن که نیاز به ثبت شدن ندارن و فکر کنم اسمشون XCopy باشه
اونی که شما میگی برای DLL هایی که از COM استفاده کردن
ولی همین dll که خودتون مثال زدین بخوای با دستور regsvr32 ثبت کنی یه اررور بهت میده

DllRegisterServer رو MSDN ببیند
من تا حالا با مشکلی برخورد نکردم ولی اگه با Regsvr32 مشکل داره می شه توی System کپیش کرد

ولی اگه اینم نمی خواین می تونه بدون کپی شدن کنار برنامه کار بده
صفحه‌ها: 1 2 3 4