2012-02-20 78 views
0

我在學習自己在運行時加載DLL文件並從那裏調用函數。 首先,我決定選擇數學cosf函數。經過一番搜索後,我瞭解到所有的數學函數都可以在msvcr100.dll中找到。因此,這裏是我寫的代碼:使用GetProcAddress在msvcr100.dll中找不到cosf

#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。
  • 函數名似乎沒有被損壞。
  • 兩個「導向」和「cosf」列在運行時庫函數參考:http://msdn.microsoft.com/en-us/library/ydcbat90.aspx

我缺少什麼? 如果我應該爲cosf使用不同的dll - 哪一個是它? cos需要雙打,我需要一個採用漂浮物的功能。

謝謝!

回答

1

<math.h>頭文件:

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

或者換句話說,這是實際使用COS()內聯函數。因此不會從DLL中導出。

+0

呃...我沒有檢查頭文件的內容。但是如果是這樣,爲什麼這個函數會出現在Dependency Walker中?它根本不應該存在於DLL中,或者......? – CygnusX1 2012-02-20 13:25:36

+0

Dumpbin.exe/exports,我沒有看到它。有一個___libm_sse2_cosf導出,我不知道它是什麼。 – 2012-02-20 13:32:59

+0

事實上,我沒有嘗試Dumpbin,我認爲Dependency Walker顯示了同樣的事情。但現在當我嘗試時,我發現這兩者之間存在顯着差異。謝謝! – CygnusX1 2012-02-20 13:52:57