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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk