2010-06-10 6 views
0

DLL에서 함수를 어떻게 호출 할 수 있습니까?dll에서 함수를 호출하려면 어떻게해야합니까?

void 포인터를 선언하고 GetProcAddress ... 결과를 저장하려했지만 작동하지 않았습니다. 나는 또한 unsigned long int (인터넷에서 어딘가에있는 것을 보았습니다)을 선언하고 싶었지만 계속 진행하는 방법을 몰랐습니다. : D

그래서, 아무도 내게 손을주지 않겠습니까?

답변

2

다음과 같이 시도해보십시오.

typedef int (*PFuncMethods)(int args); 

hDLL = LoadLibrary(L"your.dll"); 
if(!m_hDLL) 
    return; 

methods = (PFuncMethods)GetProcAddress(hDLL,"methods"); 
if (!(methods)) { 
    FreeLibrary(hDLL); 
    hDLL = NULL; 
    methods = NULL; 
    return; 
} 

if(methods(1) == 0) ... 

메서드 이름은 계속 붙어있을 수도 있습니다. C++는 과부하 (overloaded가 아닐지라도)를위한 이름 변환을 가지고 있으며 그것은 컴파일러에 의존한다. extern "C"을 사용하여 맹 글링 된 이름을 처리하거나 기능을 사용하여 mangling을 해제 할 수 있습니다. depends.exe와 같은 도구를 사용하면 정확한 이름을 가진 모든 기능을 사용할 수 있습니다.

Windows에서 (가져 오기) lib 파일을 사용하여 DLL에 정적으로 링크하는 것이 훨씬 쉽습니다.

+0

게시 주셔서 감사합니다! 내가 이미 말했듯이, previouse 주석에, 나는이 모든 서명물을 추가하고 내 코드는 문제없이 작동합니다. 모두에게 감사드립니다. – C4theWin

1

void 포인터가 아닌 함수 포인터를 만들고 그 함수 포인터에 결과를 GetProcAddress에서 저장해야합니다.

+0

사실 그것은 void 함수를 가리키는 함수 포인터였습니다. 죄송합니다. : D – C4theWin

1

정확한 기능 서명이 있어야하고 포인터를 올바르게 캐스팅해야합니다. exmaple를 들어

,이 함수 수신 INT와 반환 무효 인 경우

typedef void (*funcptr)(int); 
funcptr func = (funcptr)(void*)GetProcAddress(....) 
func(17); 

주 : 당신이 서명을 혼동하는 경우, 매우 나쁜 일이 발생할 수 있습니다. 주 2 : 사용되는 호출 규칙 (cdecl, stdcall 등)을 알아야합니다.

DLL 인 경우 가져 오기 라이브러리를 만드는 것이 좋습니다.

+0

게시 주셔서 감사합니다! 나는이 모든 기능 서명 물건을 추가하고 지금 작동합니다! 도와 줘서 고마워. – C4theWin

관련 문제