Bagikan melalui


Cara: Memanggil DLL asli dari kode aman menggunakan PInvoke

Fungsi yang diimplementasikan dalam DLL yang tidak dikelola dapat dipanggil dari kode terkelola menggunakan fungsionalitas Platform Invoke (P/Invoke). Jika kode sumber untuk DLL tidak tersedia, P/Invoke adalah satu-satunya opsi untuk mengoperasikan. Namun, tidak seperti bahasa .NET lainnya, Visual C++ menyediakan alternatif untuk P/Invoke. Untuk informasi selengkapnya, lihat Menggunakan Interop C++ (PInvoke Implisit).

Contoh

Contoh kode berikut menggunakan fungsi Win32 GetSystemMetrics untuk mengambil resolusi layar saat ini dalam piksel.

Untuk fungsi yang hanya menggunakan jenis intrinsik sebagai argumen dan mengembalikan nilai, tidak diperlukan pekerjaan tambahan. Jenis data lainnya, seperti penunjuk fungsi, array, dan struktur, memerlukan atribut tambahan untuk memastikan marshaling data yang tepat.

Meskipun tidak diperlukan, ada baiknya untuk membuat deklarasi P/Invoke anggota statis dari kelas nilai sehingga mereka tidak ada di namespace layanan global, seperti yang ditunjukkan dalam contoh ini.

// 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);
}

Baca juga

Menggunakan PInvoke Eksplisit di C++ (Atribut DllImport)