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

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


سوال

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

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

سپاس گزارم.

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


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

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

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

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

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

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

سپاس گزارم.

درود،

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

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


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

درود،

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

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

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 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;
}

 

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 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 یا استفاده شئ از اطلاعات کتابخانهٔ دیگه رو صادر کنیم.  امیدوارم که این بیانیهٔ من از اطلاعات شما درست باشه، اگه نیست، بیشتر فکر می‌کنم و اگه متوجه نشدم، لطف بکنید و کمی ساده‌تر برای بنده توضیح بدید. 

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

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


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

به گفتگو ملحق شوید

شما همین الآن می‌توانید مطلبی را ارسال و بعداً ثبت‌نام کنید. اگر حساب کاربری دارید، و با حساب کاربری خود مطلب ارسال کنید.
نکته: مطلب شما قبل از انتشار نیاز به بازبینی توسط میانجی‌گر‌ها دارد.

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

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

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

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

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

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


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

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

×
×
  • جدید...