2012-02-20 1 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 

이유는 무엇입니까?

  • 오류 코드 ERROR_PROC_NOT_FOUND 127 스탠드 - 지정된 프로 시저를 찾을 수 없습니다.
  • 종속성 워커에 따르면 MSVCR100.DLL에는 cosf 함수가 있습니다. 서수 1349, 진입 점 0xC2750.
  • 함수 이름이 맹 글링되지 않는 것 같습니다.
  • 모두 '왜냐하면'와 '사인, 코사인은'런타임 라이브러리 함수 참조에 나열되어 있습니다 http://msdn.microsoft.com/en-us/library/ydcbat90.aspx

나는 무엇을 놓치고? cosf에 다른 dll을 사용해야하는 경우 - 어떤 DLL입니까? cos은 두 배가 걸립니다. 나는 수레를 필요로하는 함수가 필요합니다.

감사합니다. <math.h> 헤더 파일에서

답변

1

:

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

또는 다른 말로

, 그것은 실제로() COS를 사용하는 인라인 함수입니다. 따라서 DLL에서 내 보내지 않습니다.

+0

Ow ... 헤더 파일의 내용을 확인하지 않았습니다. 그렇다면 왜 Dependency Walker가이 기능을 사용합니까? 그것은 DLL에 전혀 존재해서는 안됩니다 ... 아니면 ...? – CygnusX1

+0

Dumpbin.exe/exports, 나는 그것을 볼 수 없다. ___libm_sse2_cosf 내보내기가 있는데 그 기능이 무엇인지 알지 못합니다. –

+0

실제로, 나는 Dumpbin을 시도하지 않았고, Dependency Walker가 똑같은 것을 보여줄 것이라고 생각했습니다. 그러나 지금 내가 시도했을 때, 나는 그 둘 사이에 중요한 차이가 있음을 알았다. 고맙습니다! – CygnusX1

관련 문제