شرح استخدم Visual Studio لإنشاء مكتبة ديناميكية مكتبة ثابتة ، وتحميل

الادارة كريم

مشرف سابق
مجموعة الاعضاء

استعمالVisual Studioلإنشاء مكتبة ديناميكية
الخطوة الأولى هي إنشاء برنامج وحدة تحكم جديد
0e4eecb063c0a6e2a51e3f09aa9723d2.png


الخطوة الثانيةSDLدورة تطوير السلامة وخلق مختارةDLLمشروع فارغ
08c6508287a9379411f8c6a5957473eb.png


أضف .h في Explorerمع.cppملف
3c00eb4dd9904dd6ab5753e8fc81fb8e.png


be04888c0835b063948b8bbb97e4a128.png


في.hيمكن كتابة إعلان الوظيفة في الملف:

  • #pragma Once // أمر المترجم مرة واحدة رأس حماية
  • extern "C" / * قم بترجمة هذه الوظيفة في C * / __declspec (dllexport) / * قم بتسمية دالة كدالة تم تصديرها ، أي يجب استدعاء هذه الوظيفة بواسطة برامج أخرى ، أي كواجهة دالة خارجية لـ DLL.
  • */ int Add(int a,int b);
ملف .cpp

  1. #include "testdllh.h"
  2. int Add(int &a, int &b)
  3. {
  4. return a + b;
  5. }
لا يمكن الترجمة مباشرة هنا ، لأن التجميع المباشر سيولد dll ، ولا يمكن تشغيل dll مباشرة ، لذلك نختار هنا إنشاء:
3216d8c3bcdfd90d3fc7e0a50f2d0497.png


3bed7eae7c4436ab63b61fcaf4ac84da.png


ما سبق يشير إلى أن الجيل ناجح ، ندعو هناdllمحاولة:
5515d37633fd312a2abf2669c39d6923.png

تظهر التعليمات البرمجية على النحو التالي:

  • #include "testdllh.h"
  • #include <stdio.h>
  • #include <windows.h>
  • int main(){
  • HINSTANCE h = LoadLibraryA ("ConsoleApplication10.dll")؛ // تحميل مكتبة ديناميكية
  • typedef int (* FunPtr) (int a، int b)؛ // تعريف مؤشر الوظيفة للإشارة إلى الوظيفة في مكتبة Dll الديناميكية
  • if (h == NULL)
  • {
  • FreeLibrary(h);
  • printf("load dll error\n");
  • }
  • else{
  • FunPtr funPtr = (FunPtr) GetProcAddress (h، "Add")؛ // الحصول على عنوان الإزاحة لملف الوظيفة المحدد في المكتبة الديناميكية
  • if (funPtr != NULL)
  • {
  • int int = funPtr (3، 3)؛ // Call call
  • printf("3 + 3 = %d \n", result);
  • }
  • else{
  • printf("error add");
  • }
  • }
  • printf("dd");
  • getchar();
  • }
نتيجة العملية:
d424b8ac01c4d603507c83ff7a5dc90c.png

دعونا نقدم الوظائف الثلاث المستخدمة أعلاه:
LoadLibraryA、FreeLibraryGetProcAddressالوظيفةWindowsواجهة مقدمة من المستخدم لتحميل وظائف المكتبة الديناميكية
LoadLibraryA
النموذج الأولي للوظيفة:

  1. HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);
  2. _In_ LPCTSTR lpFileName: مسار المكتبة الديناميكية ليتم تحميلها
قيمة الإرجاع:
تمت إعادة مقبض الوحدة المرجعية بنجاح
FreeLibrary
النموذج الأولي للوظيفة:

  • WINBASEAPI
  • BOOL
  • WINAPI
  • FreeLibrary(
  • _In_ HMODULE hLibModule
  • );
  • _In_ HMODULE hLibModule ؛ تم إرجاع مقبض وحدة المكتبة الديناميكية بواسطة LoadLibrary
قيمة الإرجاع: صحيحة إذا كانت ناجحة ، وإلا كانت خاطئة
GetProcAddress
النموذج الأولي للوظيفة:

  1. FARPROC GetProcAddress(
  2. HMODULE hModule ، // مقبض الوحدة النمطية DLL
  3. LPCSTR lpProcName // اسم الوظيفة
  4. );
قيمة الإرجاع: إرجاع عنوان العنوان / الإدخال الأول للدالة المحددة في ملف الوحدة النمطية DLL


بالإضافة إلى ذلك ، يمكنك أيضًا استخدام Visual Studio لتضمين مكتبة DLL مباشرةً. أولاً وقبل كل شيء ، عندما نقوم بتجميع مكتبة الارتباط الحيوي (DLL) وإنشاءها ، يوجد بالفعل ملف مكتبة lib:



86bbd3be3480f3266bbbbc5f308cbed0.png

ليبملف مكتبةcopyإلى مسار مشروعنا ، فيدللقم بالتسجيل حسب بت نظامكcopyإلىSystem32/SysWOW64تحت المحتويات
اقتباس مباشر في خصائص المشروع:
c8f3d89553b5fa34042793439a33a39e.png

ادارة:
63bc733b64afc41f761fb788bc76b6c4.png


نتيجة العملية:
f124eec897a796181a2c3508f95c9a4f.png

لاحظ هنا لتقول لماذا دللسوف يولدlibملف؟
Libالذي يحتوي علىdllمعلومات الوصف ، مثل جدول رمز الوظيفة وعنوان الإزاحة ومعلومات أخرى ، بدلاً من الرمز الفعلي ، لذلك نحن فيvsideيحتوي على هذاLibملف،vsقراءة تلقائيا أثناء المترجمlibمعلومات التكوين ، ثم انتقل إلى النظام لتحديد دليل المكتبة الديناميكي للتحميلdllمكتبة!
سيستخدم المترجم ملف lib فقط في وقت الترجمة للحصول على بعض المعلومات في مكتبة dll ، ولن يتم تحميله في البرنامج!


مكتبة ثابتة:
03dea61da6e55410396ad681fb019e3d.png


أضف .h و. cpp
9945f210ed7873cb2ca4487f44e37d26.png


ملف .h:

  • #pragma Once // أمر المترجم مرة واحدة رأس حماية
  • extern "C" / * قم بترجمة هذه الوظيفة في C * / __declspec (dllexport) / * قم بتسمية دالة كدالة تم تصديرها ، أي يجب استدعاء هذه الوظيفة بواسطة برامج أخرى ، أي كواجهة دالة خارجية لـ DLL.
  • */ int Add(int a, int b);
ملف .cpp:

  1. #include "libh.h"
  2. int Add(int &a, int &b)
  3. {
  4. return a + b;
  5. }
انشاء:
b870d64cec93f9e21873350338677ffc.png


22a946ee3a52ffb2985ffd56cda3dca0.png


استخدم تعليق أمر المترجم لتحميل:

  1. #include "libh.h"
  2. #include <stdio.h>
  3. #pragma comment (lib، "ConsoleApplication12.lib") // تحميل مكتبة ثابتة
  4. int main(){
  5. نتيجة int = Add (3، 3)؛ // Call call
  6. printf("3 + 3 = %d \n", result);
  7. printf("dd");
  8. getchar();
  9. }
نتيجة العملية:
7a0b80b53adbc956fad1c6510dbb2297.png
 

admin

عضو إداري
ادارة المنتدى

شرح وافى وكافى
تسلم على الموضوع الرائع
تحياتي لك

 

أعلى