2010-06-20 3 views
0

LoadLibrary()을 사용하여 동적으로 DLL을로드하려고하는데, 호출하려고하는 DLL에서 함수의 주소를 가져올 수 없습니다.왜 내 DLL 함수에 액세스 할 수 없습니까?

DLL 기능 : (CPP 파일)

_declspec(dllexport) void MyDllFunc() 
{ 
    printf("Hello from DLL"); 
} 

호출 코드 :

typedef void (*MyDllFuncPtr)(); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    HINSTANCE LoadMe; 
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll"; 

    LoadMe = LoadLibrary(str); 

    if(LoadMe != 0) 
     printf("Successfully Loaded!\r\n"); 
    else 
     printf("Loading Failed \r\n"); 


    MyDllFuncPtr func; 

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc"); 

    if (func != NULL) 
     func(); 

    FreeLibrary(LoadMe); 

} 

FUNC NULL을 반환!

내가 뭘 잘못하고 있니?

이것은 Win32 콘솔 프로젝트입니다.

+0

dll이 C++로 작성 되었다면 C++ 이름을 mangeling과 일치시켜야합니다. 내보내기 테이블을보고 함수 이름을 살펴보십시오. 또는 dll에서 extern C로 함수를 선언하십시오.이 함수는 C++ 이름 mangeling을 제거합니다. DLL 또는 코드에서 –

답변

3

extern "C" _declspec(dllexport) void MyDllFunc() 
+0

?? –

+0

In DLL이면 충분합니다. 그래서 그 이름이 제대로 엉망이되어 기호를 얻을 수 있습니다. – Artyom

0

는 DLL이 C++ DLL로 구축되면 쓰기,이 기능의 이름이 변경됩니다 있어요. 이것은 컴파일러에 따라 다릅니다. 나는 그것을 C DLL (C 인터페이스 + C++ 내장)으로 만들 것을 강력히 권고한다. 나에게 예제가 없다.하지만 그물에서 뭔가를 찾을 수 있어야한다.

1

잘못하고 있습니다. __declspec (dllexport)는 __declspec (dllimport)과 쌍을 이룹니다. 당신이 __declspec (같이 DllImport) 및 __declspec (dllexport)를 사용하는 경우

#1: In the DLL, declare the function's prototype with __declspec(dllexport). 
#2: In the .exe, declare the function's prototype with __declspec(dllimport). 
#3: Compile the .dll. You should also get a .lib file. 
#4: Link the .exe with the .lib, and compile. 
#5: Success. 

, 당신은 DLL을로드하기위한 WinAPI를 기능을 터치 할 필요가 없습니다. dllimport/export가 모든 작업을 수행합니다. 또한, C를 extern 할 필요가 없습니다.

1

내 보낸 함수를 사용하면 extern "C"를 사용하여 장식을 줄일 수 __declspec(dllexport)를 사용할 때의이 decorated 인하는 이름, 그러나, 완전히 명명 된 상징으로 def file를 사용하고 내보낼 필요가해야 할, 기호를 장식되지 않습니다 그렇지 않으면 extern "C"을 사용하여 내보낼 때 짧음 인 맹 글링/데코레이션 된 심볼 이름을 사용하여 GetProcAddress을 사용해야합니다.

+0

위대한 요점은 사람들이 많은 C 컴파일러가 이름을 장식한다는 것을 잊어 버리는 경향이 있습니다. – bk1e