كيفية القيام بما يلي: استدعاء 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);
}