我试图理解并预测如何在DLL中引用函数。
当我们在一些我们正在访问的DLL中引用一些函数进行一些计算时,在某些函数中,我们只使用进程名称作为参数lpProcName
(例如"my_calc_function"
)。但是,在一些其他函数中(对于不同的DLL),我们必须向lpProcName
添加各种装饰(例如"?my_other_calc_function@@YA...."
)
在一个案例中
m_lpfn_my_calc_function_pointer = (lpfn_my_calc_func)::GetProcAddress(m_hOneDll,"this_address_works");
在另一个案例中
m_lpfn_my_other_calc_function_pointer = (lpfn_my_calc_func)::GetProcAddress(m_hAnotherDll,"?this_address_has@@YAXNPEAN00PEAH@Z");
然而,这两项工作,我想了解装饰的含义以及我可以在哪里引用它们,以便在编写代码时能够预测它们。
装饰(或者,name mangling)基于这样一个事实,即您可以使用相同名称但不同参数的函数。
DLL导出不包括函数签名,只包含名称。因此,名称是“装饰”以反映这些参数(类,名称空间,参数,返回类型,调用约定等)。
要删除装饰,请在extern "C"
块中声明该函数。