문제

C / C ++ DLL을 작성 중이고 이와 같은 .def 파일을 사용하기 전에 수행 한 특정 기능을 내보내고 싶습니다 라코 디스

예를 들어 다음과 같이 정의 된 코드 사용 : 라코 디스

그러나 Foo ()의 오버로드 된 메서드를 다음과 같이 선언하려면 어떻게해야합니까? 라코 디스

def 파일에는 전체 프로토 타입이 아닌 함수 이름 만 있으므로 오버로드 된 함수를 처리하는 방법을 알 수 없습니다. 하나의 항목을 사용한 다음 적절하게 프로토 타입 화 된 함수 포인터를 LoadLibrary ()에 전달할 때 원하는 오버로드 된 버전을 지정합니까?

편집 : 명확하게 말하자면, 이것은 Visual Studio 2005를 사용하는 Windows에 있습니다.

편집 : non-def (__declspec) 메서드를 대답으로 표시했습니다 ... 이것이 내가 원하는대로 def 파일을 사용하여 문제를 실제로 해결하지 않는다는 것을 알고 있지만 사용하는 (공식적인) 솔루션은 없을 것 같습니다 def 파일. 그러나 누군가 우리가 과부하 된 함수와 def 파일이없는 것을 알고 있다면 질문을 열어 둘 것입니다.

도움이 되었습니까?

해결책

코드 자체에서 __declspec (dllexport)를 사용하여 내보낼 함수를 표시합니다.예 : 라코 디스

이렇게하면 .def 파일에 함수를 나열 할 필요가 없습니다.

또는 다음과 같은 기본 매개 변수 값을 사용할 수 있습니다. 라코 디스

이는 사용되지 않음을 나타내는 데 사용할 수있는 b 값이 있다고 가정합니다.-1이 b에 대한 올바른 값이거나 기본값이 없거나 없어야하는 경우 작동하지 않습니다.

Edit (Adam Haile) : __dllspec이 올바르지 않아 __declspec을 사용하도록 수정되었으므로 공식 답변으로 표시 할 수 있습니다. 충분히 가깝습니다.

편집 (Graeme) : 죄송합니다. 오타를 수정 해 주셔서 감사합니다!

다른 팁

함수 오버로딩은 이름 맹 글링 (링커 오류 메시지의 비밀 함수 이름)에 의존하는 C ++ 기능입니다.

잘린 이름을 def 파일에 쓰면 테스트 프로젝트를 연결하고 실행할 수 있습니다. 라코 디스

일하는 것 같음 라코 디스

따라서 오류 메시지에서 C ++ 함수 이름을 복사하여 def 파일에 씁니다.그러나 실제 질문은 다음과 같습니다. __declspec (dllexport)와 함께 사용하지 않고 def 파일을 사용하려는 이유는 무엇입니까?

잘린 이름은 이식 할 수 없으며 VC ++ 2008로 테스트했습니다.

비슷한 문제가있어서 이것도 게시하고 싶었습니다.

  1. 일반적으로 사용 라코 디스

    함수 이름을 내보내는 것은 괜찮습니다. 보통 이름을 내 보냅니다. 필요없이 unmangled .def 파일. 그러나 일부 __stdcall 함수와 같은 예외 오버로드 된 함수 이름입니다.

  2. 함수를 선언하여 __stdcall 규칙 (많은 API 함수에 대해 수행됨) 그런 다음 라코 디스

    다음과 같이 잘린 이름을 내 보냅니다 _Foo @ 4. 이 경우 내 보낸 이름을 명시 적으로 매핑해야 할 수 있습니다. 내부 이름을 변경합니다.

    A. 얽 히지 않은 이름을 내보내는 방법. .def 파일에서 추가 라코 디스

    내부 함수 Foo에 대한 "최적 일치"를 찾아서 내보내려고 시도합니다. 위의 경우에만 하나의 foo 이것은 매핑을 생성합니다

    Foo= _Foo @ 4

    dumpbin / EXPORTS를 통해 볼 수 있음

    함수 이름을 오버로드 한 경우 .def 파일에서 원하는 함수를 명시 적으로 지정해야 할 수 있습니다. entryname [= internalname] 구문을 사용하여 잘린 이름을 지정합니다. 예 : 라코 디스

    B. .def 파일의 대안은 #pragma를 사용하여 이름을 "제자리"로 내보낼 수 있다는 것입니다. 라코 디스

    C. 세 번째 대안은 Foo의 한 버전 만 외부 "C"로 선언하여 암호화되지 않은 상태로 내보내는 것입니다. 자세한 내용은 여기 를 참조하세요.

dll 인터페이스는 C API이기 때문에 원하는 작업을 수행하는 공식적인 방법은 없습니다.

컴파일러 자체는 해결 방법으로 이름 변경을 사용하므로 코드에서 너무 많이 변경하지 않으려면 이름 변경을 사용해야합니다.

매 글링 규칙은 컴파일러가 릴리스 될 때마다 변경 될 수 있으므로 오버로드 된 함수를 내보내는 언어 또는 버전에 구애받지 않는 방법이 없습니다.

이것이 대부분의 WinXX 함수에 * Ex 또는 * 2와 같은 재미있는 이름이있는 이유 중 하나입니다.

EXPORTS 정의의 구문은 다음과 같습니다. 라코 디스

entryname 은 내보내려는 함수 또는 변수 이름입니다.이것은 필수입니다.내보내는 이름이 DLL의 이름과 다른 경우 내부 이름을 사용하여 DLL에 내보내기 이름을 지정합니다.

예를 들어 DLL이 함수 func1 ()을 내보내고이를 func2 ()로 사용하려면 다음을 지정합니다. 라코 디스

다양한 이름 (Dependency walker 사용)을보고 자신의 함수 이름을 지정하기 만하면됩니다.

출처 : http://msdn.microsoft.com / en-us / library / hyx1zcd3 (v= vs.71) .aspx

편집 : 이것은 Dll에서 명시 적으로 함수를 가져 오기 위해 GetProcAddress ()를 사용해야하는 동적 DLL에서 작동합니다.

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