2017-11-08 14 views
0

내가 VS2010를 사용하고 있는데 나는이처럼 보이는 계층 응용 프로그램이 있습니다 :DLL에 의해로드 된 DLL의 함수에 링크하는 방법은 무엇입니까?

app.exe 
DLL1.dll 
DLL2.dll 

App.exe가로드 DLL1하고 다음 DLL2를로드합니다. 내 앱이 DLL2의 함수를 DLL2::setvariable(value)처럼 호출하기를 원한다.

DLL2.dll에 대한 lib 파일을 지정하지 않고도 내 vc6 작업 영역에서 제대로 설정했습니다. 내 VS2010 환경에서 어떻게 설정합니까? DLL2.dll에 대한 모든 호출에 대해 해결되지 않은 기호 링커 오류가 계속 발생합니다.

나는 모두 app.exeDLL1.dll에서 #pragma comment(lib ,"DLL2.lib") 을 포함하도록 시도하고 그것은이 부하 DLL2.dll와 모든 변수를 두 번 링크 만합니까?

+1

_ "...하지만이 DLL2.dll과 모든 변수를 두 번로드합니까?"_ 아니요 –

+0

올바른 방법입니까? – Mozly

+0

링커는 가져 오기 라이브러리가없는 DLL에 대해 링크 할 수 없습니다. 20 년이 지난 도구를 사용하든 최근의 도구를 사용하든 상관 없습니다. – IInspectable

답변

2

DLL은 응용 프로그램의 주소 공간에 한 번만로드됩니다. Windows 디자인입니다. dll에 대한 import-library는 dll (LoadLibrary())을로드하고 dll 함수에 로컬 함수 이름을 지정합니다. LoadLibrary()GetProcAddress()으로 전화를 걸어 직접 할 수도 있습니다. Documentation따르면

:

시스템은 모든로드 된 모듈에서 프로세스 별 레퍼런스 카운트를 유지한다. LoadLibrary를 호출하면 참조 횟수가 증가합니다. FreeLibrary 또는 FreeLibraryAndExitThread 함수를 호출하면 참조 횟수가 감소합니다. 참조 카운트가 0이되거나 프로세스가 종료되면 시스템은 모듈을 언로드합니다 (참조 카운트에 관계없이).

그래서 아니, DLL이로드 전용 한 번 만의 "UseCount는"에 대한 lib 디렉토리 파일을 지정하지 않고 내 VC6 작업 공간에서 제대로이 설정 한 2

로 설정 DLL2.dll

당신이 그것을 했는가, 그렇지 않으면 어떻게 당신이 다음 app.exe에서 DLL2::setvariable(value)를 호출하지 않은 것 같아요?

올바른 방법인가요? (대신 #pragma를 사용하지만, rseult은 동일합니다 - - 대부분의 개발자들처럼 단순히 프로젝트에 lib을 포함 할 수 있지만)

그것을 할 수있는 한 가지 방법이다. 다른 대안은 사용자가 LoadLibrary()/ GetProcAddress() (조건부로 dll을로드하려는 경우 유용)으로 호출하는 것입니다. 내가 아는 다른 방법은 없어.

+0

vc6 프로젝트의 app.exe에서 DLL2.dll을 호출했습니다. 컴파일 시간에 DLL을 링크하는 암시 적 설정이 있다고 생각합니다. 나는 VC6에 처음 온 사람이다. – Mozly

+0

예, ** 가져 오기 라이브러리 ** (DLL이 아니요, 런타임에 동적으로로드/링크 됨), 어쨌든 프로젝트에 포함되어 있어야합니다 (아마도 포함 파일의'#pragma'를 통해)? 그렇지 않으면 링크 오류가 발생합니다. 이것이 제가 의도 한 바입니다. –