2017-03-23 1 views
-1

나는 그것에서이 기능을 가지고 C에 내장 된 DLL (example.dll)가 있습니다. 이제 간단한 COM 개체를 사용하여 ATL 프로젝트에서 free_job() 메서드를 호출하려고합니다. 그것은 컴파일되지 않습니다외부 라이브러리 방법이 해결되지 않는 이유는 무엇입니까?</p> <pre><code>void WINAPI free_job() { lc_free_job(jobPtr); } </code></pre> <p>나는이 DLL을 구축하고 내 비주얼 C++ 프로젝트에 <code>example.lib</code>를 연결 한 :

STDMETHODIMP CCerberusSession::Free(CHAR* licensePath, CerberusErrorDetails* error) 
{ 
    free_job(); 
    return S_OK; 
} 

: 내 구현에 전화를 어디에

#include "..\lib\example.h" 

이것은 다음은 라이브러리를 참조하는 내 헤더의 일부이다. 다음 오류가 발생합니다.

Error LNK2019 unresolved external symbol "void __stdcall free_job(void)" ([email protected]@YGXXZ) referenced in function "public: virtual long __stdcall CCerberusSession::Free(char *,struct CerberusErrorDetails *)" ([email protected]@@[email protected]@@Z)

내가 뭘 잘못하고 있으며 어떻게 해결할 수 있습니까? 어떤 아이디어라도 도움이되고 감사 할 것입니다.

편집 : 나는이 같은 컴파일하려고하면

extern "C" { 
#include "..\lib\example.h" 
} 

하지만 다음과 같은 오류가 발생합니다 : : 나는 실행하고

Error MSB8011 Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.

나는 그렇게 같이 포함 포장하는 것을 시도했다 Visual Studio를 관리자로 사용. 그 밖의 무엇이 여기에서 틀릴 수 있 었는가?

+2

잘 컴파일하면 링크되지 않습니다. 링커 오류 메시지에서 C++ 이름을 잘못 표시합니다. C 식별자는 맹 글링되지 않아야합니다. #include 주위에'extern "C"{}'가 필요합니다. –

+0

@HansPassant 감사합니다 한스. include를 래핑하면 다른 오류가 표시됩니다. '오류 MSB8011 출력을 등록하지 못했습니다. 높은 수준의 사용 권한을 사용하여 사용자 단위 리디렉션을 사용하거나 명령 프롬프트에서 구성 요소를 등록하십시오. "질문을 편집했습니다. 그 밖의 무엇이 여기에 문제가 될 수있는 아이디어가 있습니까? 확신 할 수는 없지만,이 작업은 ATL 프로젝트와 관련이 있으며 현재 시스템에 출력을 등록하지 못하고 있습니까? 포함 된 DLL을 해결할 수없는 것과 관련이 있습니까? 어떤 아이디어라도 큰 도움이 될 것입니다. – Alexandru

+1

물론 완전히 다른 문제입니다. "승격 된 권한"이란 무엇을 의미합니까? 그것은 아주 잘 googles, 무기력하지 않으려 고 노력하십시오. –

답변

-1

첫 번째 문제는 내가 #include 문 (그 지적에 대한 한스 감사합니다) 것을 포장하기 위해 필요한이었다

extern "C" { 
#include "..\lib\example.h" 
} 

두 번째 문제는 regsvr32.exe 때문. DLL이 컴파일 된 ATL 프로젝트와 동일한 출력 디렉터리에 없기 때문에 내 응용 프로그램이 가져 오는 종속 DLL을 찾을 수 없습니다. C:\Cerberus\Debug\ :

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1749,5): warning MSB3073: The command "regsvr32 /s "C:\Code\Cerberus\Debug\Cerberus.dll"" exited with code 3. 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1761,5): error MSB8011: Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions. 

난 그냥 출력 디렉토리에 example.dll을 포함하는 데 필요한 : 당신은 비주얼 스튜디오에서 Output 탭을 선택하면 예를 들어, 당신은 다음과 같이 표시됩니다.