2014-09-16 10 views
2

여기 내 DLL 코드입니다, 실패 :GetProcAddress를() 오류 127

#include <Windows.h> 
#include <iostream> 

int sysLol(char *arg); 

int sysLol(char *arg) 
{ 
    std::cout<<arg<<"\n"; 
    return 1; 
} 

는 그리고 여기 내 응용 프로그램 코드입니다 :

그래서, 내 LIB.dll가 성공적으로 LoadLibrary()를 사용하여로드
#include <Windows.h> 
#include <iostream> 
#include <TlHelp32.h> 
#include <stdlib.h> 

typedef int (WINAPI* Lol)(char* argv); 
struct PARAMETERS 
{ 
    DWORD Lol; 
}; 

int main() 
{ 
    PARAMETERS testData; 
    HMODULE e = LoadLibrary(L"LIB.dll"); //This executes without problem 
    if (!e) std::cout<<"LOADLIBRARY: "<<GetLastError()<<"\n"; 
    else std::cout<<"LOADLIBRARY: "<<e<<"\n"; 
    testData.Lol = (DWORD)GetProcAddress(e,"sysLol"); //Error 127? 
    if (!testData.Lol) std::cout<<testData.Lol<<" "<<GetLastError()<<"\n"; 
    else std::cout<<"MESSAGEBOX: "<<testData.Lol<<"\n"; 
    std::cin.ignore(); 
    return 1; 
} 

, 아직 GetProcAddress() 실패를 with 127. 이것은 내 함수 이름을 찾지 못해서 발생하는 것 같지만 왜 실패하는지 알 수 없습니다.

도움을 주시면 대단히 감사하겠습니다! :) ~ P

답변

2

여러분은 함수에 대한 C 이름을 선언해야합니다 :

extern "C" int sysLol(char *arg); 

당신은 컴파일러가 Dependency Walker와 C++ 기능을 준 실제 이름을 볼 수 있습니다. 성공, 기능을 던져

은 실제 함수 타입에 GetProcAddress를에 의해 반환 된 포인터 :

typedef int (*sysLol_t)(char *arg); 
sysLol_t pFunc = GetProcAddress(e,"sysLol"); 
1

즉, ERROR_PROC_NOT_FOUND은 해당 이름으로 내 보낸 기능이 없음을 의미합니다.

말할 것도 없습니다. 아마도 당신은 그 이름이 틀렸을 것입니다. 그것은 대소 문자의 단순한 불일치 일 수 있습니다. 아마도 DLL이 잘못 빌드되어 함수를 내보내는 것이 아닙니다. 아마도 DLL은 이름을 꾸미거나 맹 글링하고있을 것입니다. 확실히이 질문의 코드에서, 함수를 내보내려고했거나 장식/mangling을 실제로 억제했다는 증거는 없습니다.

내 보낸 된 함수의 이름을 검사 dumpbin 또는 종속성 워커 같은 도구를 사용합니다. 그것은 문제에 대해 밝힐 수 있습니다.

런타임에 LoadLibraryGetProcAddress으로 연결하는 대신로드시 링크하는 것이 훨씬 편리합니다. DLL을 빌드 할 때 생성 된 .lib 가져 오기 라이브러리를 사용하십시오.

그것은 호출 규칙이 일치하지 않는 지적 또한 가치가있다. 당신은 DLL 측에서 cdecl을 가지고 있고, 실행 측에서는 stdcall을 가지고있다. 그리고 포인터를 DWORD으로 보내지 마십시오. 64 비트로 컴파일 할 때 심하게 끝납니다. 이 태그는 C의 ++이기 때문에

+0

음을 참조하십시오, 이것은 프로세스 주사에 사용하기위한, 그래서로드 시간 링크는 나를 위해 옵션이 아닙니다. 실제 소스가 내가 게시 한 것보다 훨씬 복잡하기 때문에 호출 규칙이 일치하지 않으므로 위의 내용을 코드로 압축해야합니다. 빠른 입력 오류가 발생할 가능성이 있습니다. 지금까지 DWORD로 캐스팅하는 동안 프로세스 삽입은 32 비트 프로세스를 가리키고 32 비트 실행 파일로 컴파일되지만 결국에는 64 비트로 확장 할 계획이므로 팁을 주셔서 감사합니다 . :) – Phixle

+0

괜찮습니다. 나는 내가 볼 수있는 것에 대답했다. 나는 아직도 당신의 질문에 대답했다고 생각합니다. –

+0

물론! 그리고 물론 "고맙습니다"라고 함축되어 있습니다! :) – Phixle

0

기호가 명시 적으로 윈도우 DLL을에서 내 보내야합니다 . 함수를 __declspec(dllexport)으로 선언하거나 DEF 파일을 링커에 전달하여 함수를 내보내도록 지시하십시오. this description of dllexport.

+0

시작이지만 내 기능 이름이 장식되어있는 것 같습니다. 지금은 인터넷 검색 중입니다. 그러나 여기있는 동안 Visual Studio 2012 환경에서이 문제를 해결할 방법을 알고 있습니까? – Phixle

+0

신경 쓰지 마라. @ egur의 대답은 그 대답이다 : P – Phixle