Mengapakah nama fungsi yang dieksport C DLL kadangkala dihiasi, dan bagaimanakah saya boleh mengeksport nama yang tidak dihias?

Patricia Arquette
Lepaskan: 2024-11-12 09:30:02
asal
682 orang telah melayarinya

Why are C   DLL exported function names sometimes decorated, and how can I export undecorated names?

Eksport C DLL: Nama Berhias/Mangled

Dalam pembangunan C DLL, nama fungsi yang dieksport dijangka kelihatan tidak dihias selepas penyusunan. Walau bagaimanapun, menemui nama fungsi yang dihias dengan aksara tambahan mungkin menimbulkan kebimbangan.

Punca Hiasan

Hiasan yang dilihat adalah hasil daripada proses pencabulan nama pengkompil. Apabila menyusun kod C, pengkompil mengubah suai nama fungsi untuk memastikan keunikan merentas fungsi terlampau beban atau unit kompilasi yang berbeza. Mangling ini termasuk aksara dan simbol tambahan.

Penyelesaian Menggunakan Komen Pragma

Untuk mengeksport nama fungsi yang tidak dihias, tanpa menggunakan fail definisi modul, ulasan pragma boleh dimasukkan:

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

Sebagai alternatif, untuk mendapatkan nama fungsi yang dihias secara automatik:

#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
Salin selepas log masuk

Equivalent Extern "C" dengan Declaration Specifier

Satu lagi pendekatan ialah menggunakan extern "C" dengan deklarasi specifier:

extern "C" void __declspec(dllexport) SomeFunction();
Salin selepas log masuk

Bagaimanapun, kaedah ini masih menghasilkan fungsi berhias yang sama nama.

Menghapuskan Postfix

Malangnya, hiasan siaran "=" tidak boleh dihapuskan tanpa menggunakan fail definisi modul atau ulasan pragma. Postfix ini menunjukkan versi berhias fungsi.

Penyelesaian untuk Aplikasi C#

Walaupun nama yang tidak dihias lebih diutamakan, panggilan P/Invoke dalam C# masih boleh dibuat menggunakan nama fungsi yang dihias. Untuk berbuat demikian, masukkan nama yang dihias sepenuhnya apabila menggunakan fungsi tersebut.

Atas ialah kandungan terperinci Mengapakah nama fungsi yang dieksport C DLL kadangkala dihiasi, dan bagaimanakah saya boleh mengeksport nama yang tidak dihias?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan