نمایش نتایج 1 تا 11 از 11

نام تاپیک: استفاده از DLL در برنامه VC++‎

  1. #1

    Question استفاده از DLL در برنامه VC++‎

    با سلام
    لطفا مراحل استفاده از فایل DLL را در برنامه کامل توضیح دهید ...
    (تازه VC++‎ را شروع کرده ام)
    چند روشی را در وب خواندم اما به جواب نرسیدم ... در صورت امکان مثالی نیز بنویسید
    با تشکر

  2. #2

    نقل قول: استفاده از DLL در برنامه VC++‎

    سلام.
    لطفا این مقاله رو مطالعه کنید. قدم به قدم براتون توضیح میده که چطوری DLL رو ایجاد کنید و چطوری اونو در برنامه مقصد به کار بگیرید.
    اگر مقاله رو خوندید و بازهم سوالی داشتید، بفرمایید تا پاسخ بدم.

    موفق باشید.

  3. #3

    نقل قول: استفاده از DLL در برنامه VC++‎

    نقل قول نوشته شده توسط mehdi.mousavi مشاهده تاپیک
    سلام.
    لطفا این مقاله رو مطالعه کنید. قدم به قدم براتون توضیح میده که چطوری DLL رو ایجاد کنید و چطوری اونو در برنامه مقصد به کار بگیرید.
    اگر مقاله رو خوندید و بازهم سوالی داشتید، بفرمایید تا پاسخ بدم.

    موفق باشید.
    من یک پروژه که exe تولید می کرد رو میخوام به dll تبدیل کنم متدی اصلی رو با __declspec(dllexport) شروع کردم :

    __declspec(dllexport) int handleCommands(FILE *fd)
    {
    ........
    }

    و در Propertise پروژه نوع رو DLL Liberary گذاشتم و نوع خروجی رو به Dll تغییر دادم.
    dll مورد نظر ایجاد شد...
    حالا در فولدر پروژه ای که میخواستم از اون dll استفاده کنم همراه با فایل .lib قرارش دادم و در Propertise پروژه قسمت Linker --> Input--> Additional فایل Lib رو معرفی کردم
    حالا در لیست متد هام متد مورد نظر رو دارم ... اما موقع Build پروژه ارور زیر رو دریافت می کنم.

    Error 11 error C3861: 'handleCommands': identifier not found d:\files\gpshell source code\gpshelldll\clean pre1 dll\impementation.cpp 471 InfoPrePerso

    لطفا بررسی نمایید مراحلی که انجام دادم صحیح است یا خیر؟ و به چه دلیل ارور دریافت می کنم؟

    مطلب دیگه اینکه در مقاله یکی از مراحل ساخت Dll رو ایجاد .DEF فایل گفته در صورتی که در ادرس زیر گفته که اگر از __declspec(dllexport) استفاده نشه باید فایل .DEF ایجاد کنیم
    در هر صورت ایجاد هم که کردم باز ارور بر طرف نشد ...
    http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx
    آخرین ویرایش به وسیله ostovarit : دوشنبه 09 اسفند 1389 در 09:31 صبح

  4. #4

    نقل قول: استفاده از DLL در برنامه VC++‎

    سلام.
    اینطور که من متوجه شدم، شما میخواهید یک پروژه ای که خروجی EXE تولید می کرده رو به یک DLL تبدیل کنید.
    این عمل، مستلزم اعمال چندین تغییر در پروژه EXE هستش و تغییر نوع خروجی به تنهایی، باعث ساخته شدن یک DLL
    Functional نخواهد شد).

    بطور مثال Entry Point برنامه های Windows تابع WinMain هستش، در صورتیکه Entry Point در DLL ها، DllMain هستش
    (هر کدوم هم با Signature خاص خودش). من میتونم براتون توضیح بدم که چه کارهایی برای انجام این تبدیل باید انجام
    بدید، اما توصیه میکنم بدین شکل عمل کنید:

    یک پروژه جدید ایجاد کنید، (از نوع Win32) و در بخش Application Settings نوع اون رو DLL تعیین کنید. سپس توابع مورد نظرتون
    رو از اون یکی پروژه به داخل DLL منتقل کنید. در نهایت هم در فایل DEF کلیه توابع مورد نظرتون رو برای Export ثبت کنید
    (البته من خودم عموما از DEF استفاده می کردم، اما می تونید شما از __declspec(dllexport) هم استفاده کنید.
    این بخشش اهمیت چندانی نداره).

    موفق باشید.

    پاورقی: اگر دنبال درد سر هستید، این مقاله بهتون کمک میکنه که این تبدیل رو به سختی انجام بدید!
    من کماکان توصیه میکنم که از ابتدا با ایجاد یک پروژه از نوع DLL این تبدیل رو انجام بدید).

  5. #5

    نقل قول: استفاده از DLL در برنامه VC++‎

    نقل قول نوشته شده توسط mehdi.mousavi مشاهده تاپیک
    سلام.
    اینطور که من متوجه شدم، شما میخواهید یک پروژه ای که خروجی EXE تولید می کرده رو به یک DLL تبدیل کنید.
    این عمل، مستلزم اعمال چندین تغییر در پروژه EXE هستش و تغییر نوع خروجی به تنهایی، باعث ساخته شدن یک DLL
    Functional نخواهد شد).

    بطور مثال Entry Point برنامه های Windows تابع WinMain هستش، در صورتیکه Entry Point در DLL ها، DllMain هستش
    (هر کدوم هم با Signature خاص خودش). من میتونم براتون توضیح بدم که چه کارهایی برای انجام این تبدیل باید انجام
    بدید، اما توصیه میکنم بدین شکل عمل کنید:

    یک پروژه جدید ایجاد کنید، (از نوع Win32) و در بخش Application Settings نوع اون رو DLL تعیین کنید. سپس توابع مورد نظرتون
    رو از اون یکی پروژه به داخل DLL منتقل کنید. در نهایت هم در فایل DEF کلیه توابع مورد نظرتون رو برای Export ثبت کنید
    (البته من خودم عموما از DEF استفاده می کردم، اما می تونید شما از __declspec(dllexport) هم استفاده کنید.
    این بخشش اهمیت چندانی نداره).

    موفق باشید.
    بله من هم اول میخواستم به همین روش عمل کنم و dll رو از پایه بسازم اما چون تعداد توابع زیاد هست و خود پروژه به پروژه dll دیگری لینک هست ترجیح دادم برای سرعت بخشیدن به کار پروژه exe فعلی رو به dll تبدیل کنم که با توجه به گفته شما و ارور فعلی هنوز موفق نشدم ... البته متد داخل dll در برنامه قابل دسترسی هست ... اما نمیدونم این کافیه یا هنوز dll مشکل داره ...
    اگر زحمت بکشید و مراحل رو بگید فک کنم از پسش بر بیام ....
    ممنون

  6. #6

    نقل قول: استفاده از DLL در برنامه VC++‎

    نقل قول نوشته شده توسط mehdi.mousavi مشاهده تاپیک
    در پاورقی پاسخ قبلی لینکی گذاشتم که مراحل رو شرح داده. اما بازهم توصیه میکنم این کارو نکنید. :)
    (این پست رو به زودی حذف خواهم کرد، چون هیچ مطلب فنی جدیدی نداره).
    با تشکر از شما به این مقاله بر خورده بودم اما کامل نخوندمش چون همون اولش به اندازه کافی گیجم کرده بود به قول شما دردسر داره ... به هر حال یک پروژه dll خالی ایجاد کردم فایل های پروژه exe رو بهش اضافه کردم ولی دوباره همون ارور رو داد متن ارور رو یک جستجو کردم و با اضافه کردن خط زیر به اول برنامه (معرفی تابع) اون ارور بر طرف شد:

    int handleCommands(FILE *);


    حالا ارور دیگه ای بهم داده :
    Error 34 error LNK2019: unresolved external symbol "int __cdecl handleCommands(struct _iobuf *)" (?handleCommands@@YAHPAU_iobuf@@@Z) referenced in function _Card_Perso@16 Impementation.obj InfoPrePerso

    که دارم اینو سرچ میکنم اما هنوز نفهمیدم چی میگه و چکار باید کرد ...
    آخرین ویرایش به وسیله ostovarit : دوشنبه 09 اسفند 1389 در 11:43 صبح

  7. #7

    نقل قول: استفاده از DLL در برنامه VC++‎

    با جستجو هایی که کردم فکر میکنم ارور زیر مربوط میشه به .lib فایل ...
    من فایل .lib ساخته شده توسط dll رو به پروژه لینک کردم ... و اون رو در کنار بقیه فایلها سورس برنامه قرار دادم ... ولی هنوز مشکل حل نشده ...
    با توجه به اینکه من یک پروژه کتابخانه Empty را برای ساخت دی ال ال Create کردم آیا نیاز هست فایلی مثلا header به کتابخانم اضافه کنم؟
    داستان کلمه extern چیه لازمه برای معرفی تابع ازش استفاده کنم ... ممکنه این ارور مربوط به این کلمه باشه؟
    Error 33 error LNK2019: unresolved external symbol "int __cdecl handleCommands(struct _iobuf *)" (?handleCommands@@YAHPAU_iobuf@@@Z) referenced in function _Card_Perso@16 Impementation.obj InfoPrePerso

  8. #8

    نقل قول: استفاده از DLL در برنامه VC++‎

    سلام.
    این خطا وقتی رخ میده که شما متغیری رو که هنوز در header file ها تعریف نشده رو بصورت extern تعریف کنید. بطور مثال:

     extern char test;
    int _tmain(int argc, _TCHAR* argv[])
    {
    test = 'A';
    return 0;
    }


    اینجا اگر قبل از خط اول، test تعریف نشده باشه، Unresolved External Symbol خواهیم گرفت.
    (چون گفتید extern، اینو گفتم، و الا چندین حالت دیگه هم هستش که ممکنه با همین خطا مواجه بشیم).

    اینکه extern چی هستش و چی کار میکنه رو قبلا در تاپیک دیگه ای توضیح داده ام (حتما اونو مطالعه کنید).

    موفق باشید.

  9. #9

    Question نقل قول: استفاده از DLL در برنامه VC++‎

    ----------------------------
    آخرین ویرایش به وسیله ostovarit : شنبه 14 اسفند 1389 در 13:58 عصر

  10. #10

    نقل قول: استفاده از DLL در برنامه VC++‎

    برای اینکه مطمئن بشم اطلاعاتم درست هست یک نمونه پروژه تست درست کردم که متد تعریف شده در dll اول توسط dll دوم صدا زده شده و در نهایت پروژه exe از dll دوم متد مربوطه که به متد dll اول اشاره دارد را اجرا می کند. مشکلی پیش نیومد و کار میکنه..... ضمیمه میکنم

    چی باعث میشه که در پروژه اصلیم وقتی دو dll به هم لینک میشن بدون هیچ اروری dll دوم از کار می افته!!!
    فکر می کنید C بودن کد یکی از dll ها ممکن همچین مشکلی به وجود بیاره؟
    فایل های ضمیمه فایل های ضمیمه

  11. #11

    نقل قول: استفاده از DLL در برنامه VC++‎

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


    typedef int (WINAPI*cfunc)(FILE *);
    cfunc handleCommands;
    .
    .
    .
    .
    //Check if the Dll isn't Present Log the Err msg ...
    HINSTANCE gpsh = LoadLibrary("\\GDll.dll");
    if(gpsh == NULL)
    {
    LogTxt("ERROR: Unable to load library!");
    ret = -1;
    goto end;
    }

    handleCommands=(cfunc)GetProcAddress((HMODULE)gpsh , "handleCommands");
    if((handleCommands==NULL))
    {
    LogTxt("ERROR: Unable to load function(s).");
    FreeLibrary((HMODULE)gpsh);
    ret = -1;
    goto end;
    }
    else
    {
    ret = handleCommands(fd); //at last call the function
    LogTxt("handleCommands Func excute.");
    }


    با استفاده از کد بالا مشکل حل شد و dll و متد های داخل آن برای نرم افزار تست قابل شناسایی بود...

    مسئله ی عجیبی که باهاش بر خوردم آدرس دهی فایل ها است ... برای مثال در کد بالا کتاب خانه را به صورت \\GDll.dll ادرس دهی کرده ام ... اما فایل رو پیدا نمیکند! ادرس کامل هم همین وضعیت را دارد و فایل پیدا نمی شود. ایا در هنگام ادرس دهی نکته خاصی باید رعایت شود؟؟؟

    با تشکر
    آخرین ویرایش به وسیله ostovarit : شنبه 14 اسفند 1389 در 15:14 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •