2010-12-12 3 views
3

제어 할 수없는 C++ 프로그램에서로드하는 D DLL이 있습니다. 프로그램 LoadLibrary 내 DLL 및 GetProcAddress 하나의 인수 (포인터) 걸리는 "extension_load"라는 함수를 찾으려면 사용합니다. 내 D의 DLL에서 내가 가진 :내 보낸 함수 기호 이름 변경

extern (C) int extension_load(void* ptr) { 
    return 0; 
} 

그리고이 이름은 extension_load로 내 보내야하지만, GetProcAddress를 그것을 찾을 수 있도록이 4 @ extension_load로 수출되고있다. 맹 글링없이 이름을 일반 extension_load로 만드는 방법은 무엇입니까?

+0

그리고 GetProcAddress *는 * 함수를 찾지 못합니까? 'extension_load @ 4 '는 어디에서 왔는가? (즉, 어떻게이 이름을 알 수 있었습니까?) – jpalecek

+0

@jpalecek, 미안, 나는 그것이 암시 된 줄 알았다. GetProcAddress는 extension_load의 이름으로 함수를 찾지 못합니다. @ 4는 모든 인수의 바이트 길이로 구성되어 있으며 extension_load @ 4는 디버거로 프로세스를 열고 메모리의 문자열을 extension_load @ 4로 수정하면 extension_load @ 4가 현재 내보내지고있는 것을 알 수 있습니다. 발견된다. –

답변

5

내보내기의 이름을 바꾸는 .def 파일을 링커에 제공해야합니다. 문서 are here을 다운로드하려면 EXPORTS가 필요합니다.

+0

저는 D에 새로운 브랜드이고 링커에게 내보내기 이름을 바꾸는 .def 파일을 제공하는 방법을 모릅니다. 나는 커맨드 라인 옵션을 모른다. –

+0

글쎄, 그것에 대해 더 많이 배우기 시작할 때 좋은 기회라고 생각해. 귀하의 질문은 당신이 어떤 종류의 IDE를 사용하는지 또는 손으로 구축 하는지를 말하기에 충분하지 않습니다. 링크 된 사이트를 탐색하면 링커에 관한 문서도 있습니다. –

4

나는 Hans Passant의 링크에서 도움을 얻었습니다. 여기에서 (아마 나 자신도) 미래에 필요합니다 누군가를 위해 내 .DEF 파일입니다

EXETYPE NT 

EXPORTS 
    extension_load 
    DllMain 

은 내가 가진 .DEF 파일 dll.def 지정됩니다. 나는 함수는 다음과 같이 썼다 :

extern (C++) int extension_load(void* ptr) { 

와 내가 사용하는 IDE 때문에 프로젝트> 속성> 옵션 구축 및 입력으로 이동, 링커에게 DEF 파일을 제공하기 위해, D-IDE이다

nameofdef.def 

Extra Linking arguments 텍스트 상자에. D-IDE가 찾을 기본 프로젝트 디렉토리에 nameofdef.def 파일이 있다고 가정합니다.

1

def 파일이 실제로 필요하지 않습니다. 그냥 : 예컨대, export

export extern (C) int extension_load(void* ptr) { 
    return 0; 
} 

당신의 기능을 앞에 추가 그리고를 통해 컴파일 : dmd -ofmydll.dll mydll.d. 물론 DllMain()도 정의해야합니다.

관련 문제