关于GetProcAddress和名称修饰

    科技2022-08-08  115

    名称修饰(decoration)的好处和坏处

    dllexport属性告诉链接器:请将指定的函数标记为导出并为它生成一个导出项。 这个导出项是经过修饰的,对于导出多个重载的函数来说,导出修饰后的名称是十分必要的。但是,这也意味着:你传入到GetProcAddress函数中的函数字符串也需要是修饰版本的。

    从我们之前的几篇关于调用约定的文章中,我们知道,函数导出名称的修饰语法在各种硬件平台上是各不相同的,同时,随着调用约定的不同,导出的名称也会不同。 举个例子,如果你从PowerPC平台上的一个DLL中导出一个函数,则你需要使用GetProcAddress(hinst, “..SomeFunction”)来获取这个这个函数指针。 如果是80386平台上使用extern “C” __stdcall调用约定,则需要使用GetProcAddress(hinst, “_SomeFunction@8”)。如果使用的是__fastcall调用约定,则需要使用GetProcAddress(hinst, “@SomeFunction@8”)。

    另外,C 里的名称修饰和编译器厂商相关。如果是Microsoft C 编译器,则对于一个C 导出函数,需要使用GetProcAddress(hinst, “?SomeFunction@@YGXHH@Z”),但是如果是Borland C 编译器,则需要另外的函数字符串来表示。

    所以,如果你开发了一个函数,你希望你的函数在各种不同的硬件平台,或者不同的语言,或者不同的C 编译器上都可以供客户调用,那么你必须导出它的未修饰版本。

    当生成一个DLL时,

    Processed: 0.021, SQL: 8