



استعمالVisual Studioلإنشاء مكتبة ديناميكية
الخطوة الأولى هي إنشاء برنامج وحدة تحكم جديد
الخطوة الثانيةSDLدورة تطوير السلامة وخلق مختارةDLLمشروع فارغ
أضف .h في Explorerمع.cppملف
في.hيمكن كتابة إعلان الوظيفة في الملف:
ما سبق يشير إلى أن الجيل ناجح ، ندعو هناdllمحاولة:
تظهر التعليمات البرمجية على النحو التالي:
دعونا نقدم الوظائف الثلاث المستخدمة أعلاه:
LoadLibraryA、FreeLibrary、GetProcAddressالوظيفةWindowsواجهة مقدمة من المستخدم لتحميل وظائف المكتبة الديناميكية
LoadLibraryA
النموذج الأولي للوظيفة:
تمت إعادة مقبض الوحدة المرجعية بنجاح
FreeLibrary
النموذج الأولي للوظيفة:
GetProcAddress
النموذج الأولي للوظيفة:
بالإضافة إلى ذلك ، يمكنك أيضًا استخدام Visual Studio لتضمين مكتبة DLL مباشرةً. أولاً وقبل كل شيء ، عندما نقوم بتجميع مكتبة الارتباط الحيوي (DLL) وإنشاءها ، يوجد بالفعل ملف مكتبة lib:
ليبملف مكتبةcopyإلى مسار مشروعنا ، فيدللقم بالتسجيل حسب بت نظامكcopyإلىSystem32/SysWOW64تحت المحتويات
اقتباس مباشر في خصائص المشروع:
ادارة:
نتيجة العملية:
لاحظ هنا لتقول لماذا دللسوف يولدlibملف؟
Libالذي يحتوي علىdllمعلومات الوصف ، مثل جدول رمز الوظيفة وعنوان الإزاحة ومعلومات أخرى ، بدلاً من الرمز الفعلي ، لذلك نحن فيvsideيحتوي على هذاLibملف،vsقراءة تلقائيا أثناء المترجمlibمعلومات التكوين ، ثم انتقل إلى النظام لتحديد دليل المكتبة الديناميكي للتحميلdllمكتبة!
سيستخدم المترجم ملف lib فقط في وقت الترجمة للحصول على بعض المعلومات في مكتبة dll ، ولن يتم تحميله في البرنامج!
مكتبة ثابتة:
أضف .h و. cpp
ملف .h:
استخدم تعليق أمر المترجم لتحميل:
الخطوة الأولى هي إنشاء برنامج وحدة تحكم جديد

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

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


في.hيمكن كتابة إعلان الوظيفة في الملف:
- #pragma Once // أمر المترجم مرة واحدة رأس حماية
- extern "C" / * قم بترجمة هذه الوظيفة في C * / __declspec (dllexport) / * قم بتسمية دالة كدالة تم تصديرها ، أي يجب استدعاء هذه الوظيفة بواسطة برامج أخرى ، أي كواجهة دالة خارجية لـ DLL.
- */ int Add(int a,int b);
- #include "testdllh.h"
- int Add(int &a, int &b)
- {
- return a + b;
- }


ما سبق يشير إلى أن الجيل ناجح ، ندعو هنا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、FreeLibrary、GetProcAddressالوظيفةWindowsواجهة مقدمة من المستخدم لتحميل وظائف المكتبة الديناميكية
LoadLibraryA
النموذج الأولي للوظيفة:
- HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);
- _In_ LPCTSTR lpFileName: مسار المكتبة الديناميكية ليتم تحميلها
تمت إعادة مقبض الوحدة المرجعية بنجاح
FreeLibrary
النموذج الأولي للوظيفة:
- WINBASEAPI
- BOOL
- WINAPI
- FreeLibrary(
- _In_ HMODULE hLibModule
- );
- _In_ HMODULE hLibModule ؛ تم إرجاع مقبض وحدة المكتبة الديناميكية بواسطة LoadLibrary
GetProcAddress
النموذج الأولي للوظيفة:
- FARPROC GetProcAddress(
- HMODULE hModule ، // مقبض الوحدة النمطية DLL
- LPCSTR lpProcName // اسم الوظيفة
- );
بالإضافة إلى ذلك ، يمكنك أيضًا استخدام 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);
- #include "libh.h"
- int Add(int &a, int &b)
- {
- return a + b;
- }


استخدم تعليق أمر المترجم لتحميل:
- #include "libh.h"
- #include <stdio.h>
- #pragma comment (lib، "ConsoleApplication12.lib") // تحميل مكتبة ثابتة
- int main(){
- نتيجة int = Add (3، 3)؛ // Call call
- printf("3 + 3 = %d \n", result);
- printf("dd");
- getchar();
- }
