Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah cara saya Mengeksport Fungsi C DLL dan Mengelakkan Nama Dihiasi/Dihancurkan?

Bagaimanakah cara saya Mengeksport Fungsi C DLL dan Mengelakkan Nama Dihiasi/Dihancurkan?

Linda Hamilton
Linda Hamiltonasal
2024-11-13 03:25:02717semak imbas

How do I Export C   DLL Functions and Avoid Decorated/Mangled Names?

Eksport C DLL: Memahami Nama Berhias/Mangled

Mencipta C DLL dan mengeksport fungsinya adalah tugas biasa. Walau bagaimanapun, menentukan cara nama yang dieksport kelihatan boleh mengelirukan.

Nama Berhias/Mangled

Apabila mengeksport fungsi menggunakan fail Definisi Modul (MyDLL.def), anda mungkin memerhatikan nama yang dihias atau hancur seperti " SomeFunction@@@23mangledstuff#@@@@". Ini berlaku kerana pengkompil C menghiasi simbol fungsi dengan menambahkan maklumat yang diperlukan oleh masa jalan C.

Menggunakan Eksport Gaya C

Mengeksport fungsi menggunakan sintaks "C" __declspec(dllexport) luaran tidak tidak menghilangkan nama yang dihias. Ia hanya menyatakan bahawa fungsi harus mempunyai nama gaya C, tetapi hiasan kekal.

Penyelesaian

Untuk mengurangkan isu, pertimbangkan untuk menggunakan arahan pragma:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

Pragma ini mengarahkan pemaut untuk mengeksport "SomeFunction" dengan nama berhias yang ditentukan.

Penyelesaian Alternatif

Sebagai alternatif, anda boleh menggunakan pragma berikut dalam badan fungsi:

#pragma comment(linker, "/EXPORT:\"" __FUNCTION__ "\"=\"" __FUNCDNAME__ "\"")

Pragma ini menggunakan makro FUNCTION dan FUNCDNAME untuk mendapatkan semula nama fungsi dan nama yang dihias secara automatik.

Dengan menggunakan pragma ini, anda boleh mengawal hiasan simbol yang dieksport, memastikan keserasian apabila memanggilnya daripada bahasa lain seperti C#.

Atas ialah kandungan terperinci Bagaimanakah cara saya Mengeksport Fungsi C DLL dan Mengelakkan Nama Dihiasi/Dihancurkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn