내 DLL에서 내보낸 함수의 이름 변경을 어떻게 중지합니까?
-
13-09-2019 - |
문제
"GetName"이라는 함수를 내보내는 DLL을 만들려고 합니다.다른 코드에서 잘못된 함수 이름을 몰라도 이 함수를 호출할 수 있었으면 좋겠습니다.
내 헤더 파일은 다음과 같습니다
#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".
내가 도대체 뭘 잘못하고있는 겁니까?
해결책
작은 수정 - 클라넷으로 이름을 성공적으로 해결하려면
extern "C"
수출 측면에서도 수입 측면과 동일해야 합니다.
extern "C"는 proc 이름을 다음과 같이 줄입니다."_GetName".
또한 .def 파일의 EXPORTS 섹션을 사용하여 임의의 이름을 강제로 지정할 수 있습니다.
다른 팁
이는 DLL을 내보내는 경우 일반적인 현상입니다. __stdcall
협약.그만큼 @N
함수가 인수로 사용하는 바이트 수를 나타냅니다. -- 귀하의 경우에는 0입니다.
참고하세요 DLL에서 내보내기에 대한 MSDN 페이지 특히 "함수 정의에서 __declspec(dllexport) 키워드"를 사용할 때 "__stdcall 호출 규칙을 사용"하라고 말합니다.
정답은 다음과 같습니다.
extern "C" int MyFunc(int param);
그리고
int MyFunc(int param);
다른 내부 이름 지정을 사용하는 두 개의 선언입니다. 첫 번째는 C 스타일이고 두 번째는 C++ 스타일입니다.
C++가 더 복잡하기 때문에(죄송합니다, 오버로드, 가상 함수 등) 함수가 어떤 인수를 수신하는지, 어떤 유형이 반환되는지 등을 결정하기 위해 빌드 도구에 필요한 내부 이름 지정이 필요합니다. 더 복잡한 이름 지정을 사용합니다.호출 규칙은 C 및 C++ 이름 지정에도 영향을 미칩니다.
__declspec(dllexport)를 동일한 방식으로 사용할 때 이 두 가지 명명 스타일이 모두 적용됩니다.
내보낸 루틴의 이름 변경을 생략하려면 프로젝트에 모듈 정의 파일을 추가하고 입력하세요(이 경우 declspec dllexport가 필요하지 않음).
LIBRARY mylib
EXPORTS
MyFunc
이렇게 하면 명시적인 이름 장식이 생략됩니다(아래 샘플).
_MyFunc (c style, __cdecl)
_MyFunc@4 (c style, __stdcall)
?MyFunc@@YAHH@Z (c++ style, __cdecl)
?MyFunc@@YGHH@Z (c++ style, __stdcall)
"-Wl,--kill-at" 링커 스위치를 사용하여 이름 변경을 비활성화할 수 있습니다.
예를 들어 Code::Blocks의 사용자 지정 링커 설정에서 다음을 추가합니다.-Wl,--죽여라