عرض مشاركة واحدة
  #1  
قديم 05-28-2021, 02:13 AM
الصورة الرمزية الادارة كريم
الادارة كريم 
مشرف سابق
 
تاريخ التسجيل: May 2021
الدولة: مصر
المشاركات: 397
معدل تقييم المستوى: 22
الادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to behold


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

 

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


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


أضف .h في Explorerمع.cppملف




في.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 مباشرة ، لذلك نختار هنا إنشاء:




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

تظهر التعليمات البرمجية على النحو التالي:
  • #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();
  • }
نتيجة العملية:

دعونا نقدم الوظائف الثلاث المستخدمة أعلاه:
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:




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

ادارة:


نتيجة العملية:

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


مكتبة ثابتة:


أضف .h و. cpp


ملف .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. }
انشاء:




استخدم تعليق أمر المترجم لتحميل:
  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. }
نتيجة العملية:


الموضوع الأصلي : استخدم Visual Studio لإنشاء مكتبة ديناميكية مكتبة ثابتة ، وتحميل || الكاتب : الادارة كريم || المصدر : منتدى مجمع التطوير

 

رد مع اقتباس