رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
  • 0
نیما غراب

کاربرد کلمه‌ی کلیدی declspec__ در ++C


سوال

سلام بر دوستان و اساتید گرامی.

کاربرد کلمه کلیدی __decspec(dllexport) چیست و چه زمانی باید ازش استفاده کنیم؟

سپاس گزارم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

4 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 1
در 8 ساعت قبل، سید محمد عباسی گفته است :

سلام، اینکه کنترلوشون کرد، یعنی با استفاده از این کلمات کلیدی، میشه محدودشون کرد؟ که کدوم وارد بشن و کدوم وارد نشن، درسته؟ 

منظور محدود کردن نیست، در واقع شما عمل تأیید یا امضاء برای یک شیء را جهت استفاده در یک کتابخانه یا برنامه‌ی دیگر اعمال می‌کنید. این واژه‌ی کلیدی به شما اجازه می‌دهد اطلاعات کلاس ذخیره شده را در مراحل کامپایل به لینکر مشخص کنید، با توجه به مثال مربوطه استفاده از این دستور اساساً با توجه به صِفتِ dllexport به لینکر می‌گوید که شیء مورد نظر برای استفاده صادر می‌شود که توسط سایر کتابخانه‌ها (DLL) یا برنامه‌ها قابل استفاده خواهد بود. در این حالت تعاریف مربوط به اعلان‌های موجود باید در برنامه‌ی مشابه پیاده سازی شود، در غیر اینصورت خطای لینکر ساطع می‌شود. زمانی از این روش استفاده می‌شود که بخواهید DLL ای را ساخته و دیگر موارد را به آن لینک (پیوند) کنید.

در صورتی که صفت dllimport مشخص شود عمل عکسِ آن صورت می‌گیرد؛ پیاده‌سازی‌های (implementation) مربوطه به آن برای استفاده در برنامه‌ی شما وارد می‌شوند. استفاده از dllimport نیز یک گزینه‌ی اختیاری است. در صورت استفاده از این کلیدواژه، کامپایلر کد کارآمد‌تری را تولید می‌کند. با این حال بهتر است شما برای دسترسی به نماد‌ها و اشیاء داده‌های عمومی از آن استفاده کنید.

به مثال‌های زیر توجه کنید:

__declspec(dllexport) void messageBox (std::string_view msg);
__declspec(dllimport) void messageBox (std::string_view msg);

معمولاً پیشنهاد می‌شود برای داشتن یک API خوب به صورت زیر پیاده سازی شود.

#ifdef LIBRARY_API
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif

نمونه مثال از فایل سرآیند:

#ifndef MESSAGELIB_HPP
#define MESSAGELIB_HPP
#pragma once

#include <iostream>
#include <string_view>
#include <string>

#ifdef LIBRARY_API
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif

class LIBRARY_API MessageBox
{
  public:
  MessageBox();
  ~MessageBox();

  std::string_view message(std::string_view msg);
};

#endif // MESSAGELIB_HPP

تعاریف مربوطه:

#include "messagelib.hpp"

MessageBox::MessageBox() {

}

MessageBox::~MessageBox() {

}

std::string_view MessageBox::message(std::string_view msg) {
  return msg;
}

استفاده از کتابخانه در برنامه‌ها یا کتابخانه‌های دیگر:

#include <iostream>
#include "messagelib.hpp"

using namespace std;

int main()
{

  MessageBox msg;
  cout << msg.message("Hello Boy!") << endl;
  std::cin.get();

  return 0;
}

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 1
در 8 دقیقه قبل، نیما غراب گفته است :

سلام بر دوستان و اساتید گرامی.

کاربرد کلمه کلیدی __decspec(dllexport) چیست و چه زمانی باید ازش استفاده کنیم؟

سپاس گزارم.

درود،

واژه‌ی کلیدی__decspec با صفتِ dllexport به شما اجازه می‌دهد تا توابع و متغیر‌ها را برای اعلان در مرحله‌ی ورود و خروج کنترل کنید. زمانی که بخواهید داده‌ها، توابع، کلاس‌ها و یا توابع عضو کلاس را از طرف DLL مورد استفاده قرار دهید از این کلمه‌ی کلیدی استفاده می‌شود.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 4 ساعت قبل، کامبیز اسدزاده گفته است :

درود،

واژه‌ی کلیدی__decspec با صفتِ dllexport به شما اجازه می‌دهد تا توابع و متغیر‌ها را برای اعلان در مرحله‌ی ورود و خروج کنترل کنید. زمانی که بخواهید داده‌ها، توابع، کلاس‌ها و یا توابع عضو کلاس را از طرف DLL مورد استفاده قرار دهید از این کلمه‌ی کلیدی استفاده می‌شود.

سلام، اینکه کنترلوشون کرد، یعنی با استفاده از این کلمات کلیدی، میشه محدودشون کرد؟ که کدوم وارد بشن و کدوم وارد نشن، درسته؟ 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 4 ساعت قبل، کامبیز اسدزاده گفته است :

منظور محدود کردن نیست، در واقع شما عمل تأیید یا امضاء برای یک شیء را جهت استفاده در یک کتابخانه یا برنامه‌ی دیگر اعمال می‌کنید. این واژه‌ی کلیدی به شما اجازه می‌دهد اطلاعات کلاس ذخیره شده را در مراحل کامپایل به لینکر مشخص کنید، با توجه به مثال مربوطه استفاده از این دستور اساساً با توجه به صِفتِ dllexport به لینکر می‌گوید که شیء مورد نظر برای استفاده صادر می‌شود که توسط سایر کتابخانه‌ها (DLL) یا برنامه‌ها قابل استفاده خواهد بود. در این حالت تعاریف مربوط به اعلان‌های موجود باید در برنامه‌ی مشابه پیاده سازی شود، در غیر اینصورت خطای لینکر ساطع می‌شود. زمانی از این روش استفاده می‌شود که بخواهید DLL ای را ساخته و دیگر موارد را به آن لینک (پیوند) کنید.

در صورتی که صفت dllimport مشخص شود عمل عکسِ آن صورت می‌گیرد؛ پیاده‌سازی‌های (implementation) مربوطه به آن برای استفاده در برنامه‌ی شما وارد می‌شوند. استفاده از dllimport نیز یک گزینه‌ی اختیاری است. در صورت استفاده از این کلیدواژه، کامپایلر کد کارآمد‌تری را تولید می‌کند. با این حال بهتر است شما برای دسترسی به نماد‌ها و اشیاء داده‌های عمومی از آن استفاده کنید.

به مثال‌های زیر توجه کنید:


__declspec(dllexport) void messageBox (std::string_view msg);

__declspec(dllimport) void messageBox (std::string_view msg);

معمولاً پیشنهاد می‌شود برای داشتن یک API خوب به صورت زیر پیاده سازی شود.


#ifdef LIBRARY_API
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif

نمونه مثال از فایل سرآیند:


#ifndef MESSAGELIB_HPP
#define MESSAGELIB_HPP
#pragma once

#include <iostream>
#include <string_view>
#include <string>

#ifdef LIBRARY_API
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif

class LIBRARY_API MessageBox
{
  public:
  MessageBox();
  ~MessageBox();

  std::string_view message(std::string_view msg);
};

#endif // MESSAGELIB_HPP

تعاریف مربوطه:


#include "messagelib.hpp"

MessageBox::MessageBox() {

}

MessageBox::~MessageBox() {

}

std::string_view MessageBox::message(std::string_view msg) {
  return msg;
}

استفاده از کتابخانه در برنامه‌ها یا کتابخانه‌های دیگر:


#include <iostream>
#include "messagelib.hpp"

using namespace std;

int main()
{

  MessageBox msg;
  cout << msg.message("Hello Boy!") << endl;
  std::cin.get();

  return 0;
}

 

پس با این حساب، با استفاده از کلید واژه‌های ذکر شده،  می‌تونیم عملا تاییده‌ی استفاده از اطلاعات شئ MessageBox یا استفاده شئ از اطلاعات کتابخانه‌ی دیگه رو صادر کنیم.  امیدوارم که این بیانیه‌ی من از اطلاعات شما درست باشه، اگه نیست، بیشتر فکر می‌کنم و اگه متوجه نشدم، لطف بکنید و کمی ساده‌تر برای بنده توضیح بدید. 

ممنون از محبتتون.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...