Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何';通过序号导出的s函数调用了?_C_Windows_Export - Fatal编程技术网

C 如何';通过序号导出的s函数调用了?

C 如何';通过序号导出的s函数调用了?,c,windows,export,C,Windows,Export,大多数函数导出名称,但有些函数按序号导出 这些函数是如何调用的? 函数中的lpProcName或 变量名,或函数的 序数值。如果此参数为 序数值,它必须在 低阶词;高阶词 必须是零 @程序员:你的问题有两个答案。首先,链接器将知道调用哪个序号。创建库时,此信息保存在.lib文件中。否则,正如@c-smile所指出的,您可以使用GetProcAddress查找函数并调用它 int ordinal = xxx; functor = (MyFunctorType) GetProcAddress(hMo

大多数函数导出名称,但有些函数按序号导出

这些函数是如何调用的?

函数中的lpProcName或 变量名,或函数的 序数值。如果此参数为 序数值,它必须在 低阶词;高阶词 必须是零


@程序员:你的问题有两个答案。首先,链接器将知道调用哪个序号。创建库时,此信息保存在.lib文件中。否则,正如@c-smile所指出的,您可以使用GetProcAddress查找函数并调用它

int ordinal = xxx;
functor = (MyFunctorType) GetProcAddress(hMod, (LPCSTR) ordinal);
if (functor)
{
    functor(...);
}

@DriverBy:是的,这意味着.DLL中导出的符号不能超过65536个。

“按普通方式导出”-请解释您的意思。导出的函数没有名称。@Oded:那是“序号”@a编程器,您的意思是序号导出只存在于windows中吗?@DriverBy,可能没有(例如,如果OS/2也有它们,我不会感到惊讶)但这一切都与在您使用的操作系统上实现动态库的方式有关。如果此参数是序数值,它必须在低阶字中;高阶字必须为零。这意味着序数值不能大于2^16吗?通过
链接器将知道调用哪个序数
,您的意思是,只要包含函数的头文件和库,我们仍然可以使用其名称调用函数吗?是的,就我们(程序员)而言,我们不关心序数。我们仍然使用名称调用。只有在链接时(即,在我们的代码编译为对象后),这些符号才会解析为序数(或否)。链接器将知道。但是链接器如何知道函数是否仅通过序号导出?您能用一个具体的示例来解释它吗?