كيفية القيام بما يلي: استدعاء DLLs أصلية من تعليمات برمجية مُدارة بـاستخدام PInvoke

يمكن استدعاء الوظائف التي يتم تنفيذها في DLLs الغير المدارة من التعليمات البرمجية المدارة باستخدام وظيفة "استدعاء (Invoke) النظام الأساسي" (P/Invoke). في حالة عدم توفر مصدر التعليمات البرمجية لـ DLL فإن P/Invoke هو الخيار الوحيد للتفاعل . ومع ذلك، بخلاف لغات .NET الأخرى , ++Visual C يوفر بديل ل P/Invoke. لمزيد من المعلومات، راجع استخدام PInvoke) C++ Interop الضمني ).

مثال

يستخدم مثال التعليمات البرمجية التالي دالة Win32 ـGetSystemMetrics لاسترداد دقة الشاشة الحالية بالبكسل.

بالنسبة للدوال التي تستخدم أنواع مضمن فقط مثل الوسيطات و قيم الإرجاع، لا عمل إضافي مطلوب. أنواع البيانات الأخرى، مثل مؤشرات الدالة و الصفائف و البنيات ، تتطلب سمات إضافية لضمان تنظيم و إرسال بيانات مناسب.

على الرغم من أنه لم يكن مطلوباً، من الجيد جعل تصريحات P/Invoke أعضاء ثابتة لفئة قيمة بحيث لا تكون موجودة في مساحة الاسم العمومية كما هو موضّح في هذا المثال.

// pinvoke_basic.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

value class Win32 {
public:
   [DllImport("User32.dll")]
   static int GetSystemMetrics(int);

   enum class SystemMetricIndex {
      // Same values as those defined in winuser.h.
      SM_CXSCREEN = 0,
      SM_CYSCREEN = 1
   };
};

int main() {
   int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
   int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
   Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}

راجع أيضًا:

موارد أخرى

استخدام PInvoke Explicit في ++C (سمة DllImport)