আপনি যদি সরল সি রফতানি চান তবে সি ++ নয় একটি সি প্রকল্প ব্যবহার করুন। সি ++ ডিএলএল সমস্ত সি ++ টি আইএসএম (নেমস্পেস ইত্যাদি ...) এর নাম-ম্যাংলিংয়ের উপর নির্ভর করে। সি / সি ++ -> অ্যাডভান্সড এর অধীনে আপনার প্রকল্প সেটিংসে গিয়ে আপনি আপনার কোডটি সি হিসাবে সংকলন করতে পারেন, সেখানে একটি বিকল্প আছে "সংকলন করুন" যা সংকলক সুইচ / টিপি এবং / টিসির সাথে সম্পর্কিত।
আপনি যদি এখনও আপনার লাইবের অভ্যন্তরীণ লেখার জন্য সি ++ ব্যবহার করতে চান তবে সি ++ এর বাইরে ব্যবহারের জন্য অবিচ্ছিন্ন কিছু ফাংশন রফতানি করেন তবে নীচের দ্বিতীয় বিভাগটি দেখুন।
ভিসি ++ এ ডিএলএল লিবস রফতানি / আমদানি করা হচ্ছে
আপনি যা করতে চান তা হ'ল শিরোনামের শর্তযুক্ত ম্যাক্রো সংজ্ঞায়িত করা যা আপনার ডিএলএল প্রকল্পের সমস্ত উত্স ফাইলগুলিতে অন্তর্ভুক্ত থাকবে:
#ifdef LIBRARY_EXPORTS
# define LIBRARY_API __declspec(dllexport)
#else
# define LIBRARY_API __declspec(dllimport)
#endif
তারপরে এমন কোনও ফাংশনে যা আপনি রফতানি করতে চান তা আপনি ব্যবহার করুন LIBRARY_API
:
LIBRARY_API int GetCoolInteger();
আপনার লাইব্রেরি বিল্ড প্রকল্পে একটি সংজ্ঞা তৈরি করুন এটি LIBRARY_EXPORTS
আপনার ডিএলএল বিল্ডের জন্য আপনার ফাংশনগুলি রফতানি করবে।
যেহেতু LIBRARY_EXPORTS
ডিএলএল গ্রহণকারী কোনও প্রকল্পে সংজ্ঞায়িত করা হবে না, যখন সেই প্রকল্পটিতে আপনার গ্রন্থাগারের হেডার ফাইল অন্তর্ভুক্ত থাকে তবে পরিবর্তে সমস্ত ফাংশন আমদানি করা হবে।
আপনার লাইব্রেরি যদি ক্রস প্ল্যাটফর্ম হতে হয় তবে আপনি উইন্ডোজ না থাকাকালীন LIBRARY_API কে কিছুই হিসাবে সংজ্ঞায়িত করতে পারেন:
#ifdef _WIN32
# ifdef LIBRARY_EXPORTS
# define LIBRARY_API __declspec(dllexport)
# else
# define LIBRARY_API __declspec(dllimport)
# endif
#elif
# define LIBRARY_API
#endif
Dllexport / dllimport ব্যবহার করার সময় আপনাকে DEF ফাইল ব্যবহার করার দরকার নেই, আপনি যদি DEF ফাইল ব্যবহার করেন তবে dllexport / dllimport ব্যবহার করার দরকার নেই। দুটি পদ্ধতি একই কাজটি বিভিন্ন উপায়ে সম্পন্ন করে, আমি বিশ্বাস করি যে দুজনের মধ্যে dllexport / dllimport হল প্রস্তাবিত পদ্ধতি।
লোডলিবারি / পিনভোকের জন্য সি ++ ডিএলএল থেকে আনম্যাঙ্গেল ফাংশন রফতানি করা হচ্ছে
আপনার যদি লোডলিবারি এবং গেটপ্রোক অ্যাড্রেস ব্যবহার করার প্রয়োজন হয়, বা অন্য কোনও ভাষা থেকে आयात করা যেতে পারে (অর্থাত্। নেট থেকে পিনভোক, বা পাইথন / আর এফএফআই ইত্যাদি) আপনি extern "C"
সি ++ সংকলককে নামগুলি না ছড়িয়ে দেওয়ার জন্য আপনার dllexport এর সাথে ইনলাইন ব্যবহার করতে পারেন । এবং যেহেতু আমরা ডেলিম্পোর্টের পরিবর্তে গেটপ্রোকএড্রেস ব্যবহার করছি আমাদের উপরের থেকে ইফদেফ নাচ করার দরকার নেই, কেবল একটি সরল ডিলেক্সপোর্ট:
কোড:
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
EXTERN_DLL_EXPORT int getEngineVersion() {
return 1;
}
EXTERN_DLL_EXPORT void registerPlugin(Kernel &K) {
K.getGraphicsServer().addGraphicsDriver(
auto_ptr<GraphicsServer::GraphicsDriver>(new OpenGLGraphicsDriver())
);
}
এবং ডাম্পবিন / রফতানির সাথে রফতানির মতো দেখতে এখানে রয়েছে:
Dump of file opengl_plugin.dll
File Type: DLL
Section contains the following exports for opengl_plugin.dll
00000000 characteristics
49866068 time date stamp Sun Feb 01 19:54:32 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 0001110E getEngineVersion = @ILT+265(_getEngineVersion)
2 1 00011028 registerPlugin = @ILT+35(_registerPlugin)
সুতরাং এই কোডটি সূক্ষ্মভাবে কাজ করে:
m_hDLL = ::LoadLibrary(T"opengl_plugin.dll");
m_pfnGetEngineVersion = reinterpret_cast<fnGetEngineVersion *>(
::GetProcAddress(m_hDLL, "getEngineVersion")
);
m_pfnRegisterPlugin = reinterpret_cast<fnRegisterPlugin *>(
::GetProcAddress(m_hDLL, "registerPlugin")
);
extern C
ফাংশনটির প্যারামিটারের ধরণগুলি বর্ণনা করে এমন সাজসজ্জা সরিয়ে দেবে, তবে সেই সজ্জা নয় যা ফাংশনটির আহ্বানের সম্মেলন বর্ণনা করে; খ) সমস্ত সজ্জা অপসারণ করতে আপনাকে একটি ডিইএফ ফাইলে (অজানা) নাম নির্দিষ্ট করতে হবে।