2009-09-23 1 views
25

"GetName"이라는 함수를 내보내는 DLL을 만들려고합니다. 나는 다른 코드가 맹 글링 된 함수 이름을 알 필요없이이 함수를 호출 할 수 있기를 바란다.DLL의 내 보낸 함수의 이름 - mangling을 어떻게 중지합니까?

내 헤더 파일은 다음과 같습니다

#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllexport) 
#endif 

EXPORT TCHAR * CALLBACK GetName(); 

내 코드는 다음과 같습니다

내가 구축
#include <windows.h> 
#include "PluginOne.h" 

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) 
{ 
    return TRUE ; 
} 

EXPORT TCHAR * CALLBACK GetName() 
{ 
    return TEXT("Test Name"); 
} 

이 DLL이 여전히 이름으로 기능을 보냅니다 "_GetName 0 @" .

내가 뭘 잘못하고 있니?

답변

21

작은 보정 - 성공을 위해 수입에로 수출 측면으로해야합니다의 Network mode

extern "C" 

으로 이름을 해결.

extern "C"는 proc의 이름을 "_GetName"으로 줄입니다.

당신이 .DEF 파일

+0

헤이 멋진이 정확히 내가 필요로하는 거의 것입니다. 이제 다른 방법으로 원한다면 어떻게 될까요? 나는 C 함수를 가지고 있고, C++ 멤버 함수 (vtable, 모든것을 다 호출하는 규칙)가 될 수 있지만, 컴파일러는 그 이름을 맹 글링해야한다고 주장한다. – Pyjong

+0

예, C 및 C++은 다른 이름 장식 규칙을 사용합니다. C++ 클래스 멤버에서 C 함수를 호출 할 래퍼를 생성해야합니다. – Dewfy

+0

.DEF 파일 만 이름 변환을 비활성화하는 유일한 방법입니다. 'extern "C"'는 여전히 이름 장식을 사용합니다. C++이 필요로하는 것처럼 장황하지는 않습니다. – IInspectable

9

이것은 __stdcall 대회와 DLL의 수출을위한 정상에 섹션 수출의 도움으로 어떤 이름을 강제 할 수 이상 더. @Nindicates the number of bytes that the function takes in its arguments - 귀하의 경우 0입니다.

the MSDN page on Exporting from a DLL은 "함수 정의에서"키워드 __declspec (dllexport)를 사용할 때 "__stdcall 호출 규칙 사용"이라고 명시되어 있습니다. - C로되어

extern "C" int MyFunc(int param); 

int MyFunc(int param); 

먼저 다른 내부 명칭을 사용 두 선언이다

+1

[여기] (http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names) 에서처럼 '__stdcall'의 mangling을 극복하는 유일한 방법은 다음을 사용하는 것입니다 : '#pragma comment (linker, "/ EXPORT : SomeFunction = _SomeFunction @@@ 23mangledstuff # @@@@") – Pierre

+0

첫 번째 링크가 깨졌으며 두 번째 링크는 다운로드를 가리킨다 –

4

정답은 다음과 같다 스타일, 두 번째 - C++ 스타일.

빌드 도구가 함수가받는 인수를 결정하기 위해 내부 이름이 필요하며 C++이 더 복잡하기 때문에 (oop, 오버로드, 가상 함수 등) - 더 복잡한 이름 지정을 사용합니다. 호출 규칙은 c 및 C++ 이름에 모두 영향을줍니다.

같은 방식으로 __declspec (dllexport)를 사용할 때이 두 스타일 이름이 적용됩니다.

당신이 내 보낸 루틴의 이름 맹 글링을 생략 그것에서, 프로젝트에 유형을 모듈 정의 파일을 추가 할 경우 (이 경우 당신은 dllexport를 declspec 할 필요가 없습니다) :

LIBRARY mylib 
EXPORTS 
    MyFunc 

것은이 명시 적으로 생략합니다 이름 장식 (아래 샘플).

_MyFunc (c style, __cdecl) 
[email protected] (c style, __stdcall) 
[email protected]@[email protected] (c++ style, __cdecl) 
[email protected]@[email protected] (c++ style, __stdcall) 
0

"-Wl, - kill-at"링커 스위치를 사용하여 이름 맹 글링을 비활성화 할 수 있습니다.예를 들어

, 코드 :: 블록에 사용자 지정 링커 설정에 추가 : -Wl을 - 죽일-에서

관련 문제