使用GetProcAddress在msvcr100.dll中找不到cosf

时间:2012-02-20 10:13:20

标签: visual-c++ dll

我正在学习自己在运行时加载DLL文件并从那里调用函数。 首先,我决定选择数学cosf函数。经过一些搜索,我了解到所有数学函数都可以在msvcr100.dll中找到。所以这里是我写的代码:

#include <stdio.h>
#include <Windows.h>

FARPROC getEntry(HMODULE &m, const char* name) {
    FARPROC p=GetProcAddress(m, name);
    if (!p) {
        printf("Error: Entry %s not found\n", name);
        printf("Error code: %d\n",GetLastError());
        exit(1);
    } else
        printf("Entry %s loaded\n", name);
    return p;
}

int main() {
    HMODULE msvcr = LoadLibraryA("msvcr100.dll");
    if (!msvcr)
        printf("File msvcr100.dll not found\n");
    else
        printf("msvcr100.dll loaded\n");
    FARPROC fun = getEntry(msvcr, "cos");
    FARPROC fun2 = getEntry(msvcr, "cosf");
    FreeLibrary(msvcr);
    return 0;
}

如果我运行它,我会得到以下输出:

msvcr100.dll loaded
Entry cos loaded
Error: Entry cosf not found
Error code: 127

为什么?

  • 错误代码127代表ERROR_PROC_NOT_FOUND - 找不到指定的过程。
  • 根据Dependency Walker,MSVCR100.DLL中有一个cosf函数。序号1349,入口点0xC2750。
  • 函数名称似乎没有被破坏。
  • “cos”和“cosf”都列在运行时库函数引用中:http://msdn.microsoft.com/en-us/library/ydcbat90.aspx

我错过了什么? 如果我应该为cosf使用不同的dll - 它是哪一个? cos需要双打,我需要一个带浮点数的函数。

谢谢!

1 个答案:

答案 0 :(得分:1)

来自<math.h>标题文件:

inline float cosf(_In_ float _X)
        {return ((float)cos((double)_X)); }

或者换句话说,它是一个实际使用cos()的内联函数。因此,不会从DLL导出。