문제

"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,--죽여라

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top