2014-05-16 3 views
2

저는 많은 온라인 검색을 살펴 보았고 대부분 C# 또는 C++과 C#에 대해 이야기하는 예제가 있지만 C++에서 호출하는 C++을 사용하지 않은 적이 있습니다 (특히 C++/필자의 경우 WPF가 포함 된 CLI).C DLL 함수 호출 방법 C++/CLI

C++에서 C DLL 함수를 호출하는 방법을 예제로 설명해 주실 수 있습니까? extern "C"funcName()으로 정의 된 모든 함수를 가진 C DLL이 있고 내보낼 함수 이름이 모두있는 내보내기 함수 .def 파일도 있습니다. 이제이 C DLL을 가지고 어떻게 C++ 코드에서 내 보낸 함수를 호출 할 수 있습니까?

감사합니다.

+1

내 보낸 함수를 직접 호출하면됩니다. 이것은 전적으로 C++/CLI를 사용하는 요점입니다. –

+0

@HansPassant 그 * 거의 * 쉽다 ... 그러나 그렇게 쉽지는 않다. 평상시처럼 링크해야 해. C를 exten에 포함시켜야합니다. – IdeaHat

답변

6

"WPF with C++"는 언어가 아닙니다. WPF는 .NET 라이브러리입니다. C++/CLI는 사용자가 작성한 언어입니다.

C++/CLI에서 C DLL을 호출하면 DLL을 내보내는 방법에 따라 "꽤 쉽다". .NET 라이브러리를 사용하여이 작업을 수행하거나 C 라이브러리를 사용할 수 있습니다 (C 라이브러리 권장). DLL에 연결하는 방법에는 암시 적 연결 또는 명시 적 연결 두 가지가 있습니다.

암시 적 연결은 훨씬 더 깨끗합니다. imho. 하지만 헤더 파일 (편집 : , 가능하면, declspec 장식은 BenVoigt의 노트 참조)과 .lib 파일에 대한 액세스가 필요합니다. 이 중 하나라도 있으면 .lib 파일을 추가 종속성 (프로젝트 -> 속성 -> 구성 속성 -> 링커 -> 마우스 오른쪽 단추로 클릭)에 추가하고 헤더 파일 경로를 포함 (프로젝트를 마우스 오른쪽 단추로 클릭 -> 등록 정보 -> 구성 등록 정보 -> C/C++ -> 일반). 그런 다음 당신은 통근으로 "C"헤더 파일을 (이 언급에 대한 metacubed에 소품) 헤더 파일을 포함 할 수 있습니다 : 당신이 & 네임 스페이스 & 클래스의 과부하를 가질 수 있도록 C++가 이름 맹 글링을 수행하기 때문에

extern "C" 
{ 
    #inlude "c_header.h" 
} 

(이다 물건. 그것은 C++ 헤더 파일로 C 헤더 파일을 해석 (그리고 당신의 이름을 탈수)는 extern "C")

http://msdn.microsoft.com/en-us/library/d14wsce5.aspx

를 사용하지 않는 경우 또는 당신은

명시 적으로 링크 할 수 있습니다

http://msdn.microsoft.com/en-us/library/784bt7z7.aspx http://msdn.microsoft.com/en-us/library/zzk20sxw.aspx

는하지만 난 당신이 C++/CLI를 사용하고 있는지 알아내는, 즉 무엇을 Google에 말해주지 용의자. (C++ 응답도 당신을 위해 작동 할지라도).

.NET의 경우, 쉬운 트릭은 C# 호출을 찾는 것입니다 (이것은 명시 적 연결이기 때문에 .lib 파일과 헤더가 필요하지 않습니다).

http://msdn.microsoft.com/en-us/library/eyzhw3s8.aspx

지금 까다로운 비트는 C++/CLI를 사용하여 C 형태로 공상 관리 클래스를 얻고 싶은 경우에, 당신은 보안관 코드로해야한다는 것입니다. 방법을 보여주는 테이블에 대한 편리한 링크가 있습니다.

http://msdn.microsoft.com/en-us/library/ac7ay120%28vs.71%29.aspx

+0

죄송합니다. C++에서 C++/CLI로 신속하게 제 질문을 수정했습니다. 그러나 편집 할 때쯤에는 이미 잘못 생각한 것 같습니다. :-) 귀하의 답변을 주셔서 감사합니다, 나는 당신의 암시 적 연결 솔루션을 사용하여 총을 줄 것이지만, 나는 그것에 대해 조언을 원했습니다. 감사! – eecs

+0

declspec 장식이 필요하지 않습니다. 실제로 가져 오기 라이브러리의 핵심입니다. –

+0

@BenVoigt 필자가 아는 한 * dll *에서 암시 적 연결에는 __declspec (가져 오기)가 필요합니다. http://msdn.microsoft.com/en-us/library/zw3za17w.aspx. 명시 적 연결은 필요하지 않지만 LoadLibrary를 호출하고 더 많은 작업을 수행해야합니다. 비록 당신이 정적 라이브러리에 적합합니다. – IdeaHat

2

는 C++ DLL에서 C DLL이 함수를 호출하는 것은 WPF, C++/CLI 또는 네이티브 C++에 대한인지 정확히 동일합니다.

  1. 헤더 파일을 포함하십시오. 구문은 아래를 참조하십시오.
  2. .lib을 프로젝트에 가져 오는 종속성으로 추가하십시오. 또한 DLL을 사용하도록 링커를 설정하십시오. 모든 세부 사항은 Linking implicitly을 참조하십시오.
  3. 프로그램을 실행할 때 소비 DLL이 런타임 클래스 경로에 있는지 확인하십시오.
  4. 헤더 파일에 정의 된 함수를 사용하십시오.

    extern "C" { 
        #include "c_header.h" 
    } 
    

    다야 그 :로

헤더 파일 선언해야한다 포함!

편집 : 체크 아웃 : Call a C function from C++ code.

+0

감사를 위해 metacubed, @MadScienceDreams + 다른 사람들에게 의견을 전한다. "암시 적 연결"과 "명시 적 연결"사이에서 어떤 메커니즘이 가장 잘 작동하는지 더 잘 이해 한 후에 명시 적 연결을 수행해야하며 컴파일 중에 DLL을 런타임에 연결하려고한다는 것을 알았습니다 시각. 내 WPF 애플 리케이션을 사용하여 DLL을로드하고 내 보낸 DLL에서 내 보낸 함수를 사용할 계획입니다. 하지만 C++/CLI 환경에서 작성된 WPF 앱에서 어떻게 할 수 있는지 이해하는 데 어려움을 겪고 있습니다. WPF에서 Explicit Linking을 설명 할 때 도움이 될 것입니다. – eecs