2010-02-01 2 views
2

나는 WININET 클래스를 사용하는 응용 프로그램이있다 -에 정적으로 #include <afxinet.h> 내가하고 싶은 wininet.dll정적으로 링크 된 응용 프로그램 - 유효하지 않거나 손상된 DLL

을 WinInet이 기능은 내 응용 프로그램뿐만 아니라 DLL에서 호출 링크, 그래서 이어서 these steps. 그런 다음 here을 읽고 wininet.dll을 프로젝트 디렉토리에 복사했습니다. 나는 다음과 같은 오류가 구축되면

- wininet.dll : fatal error LNK1136: invalid or corrupt file

내 첫 번째 질문은 다음과 같습니다
-Am 내가 제대로 내가 정적 함수 호출 및 DLL을 연결하는 생각 일을?
- 그렇다면 왜이 설정에서는 dll이 손상되지만 이러한 변경없이 작동합니까?

도움을 주시면 감사하겠습니다. 고맙습니다.

답변

3

"정적 연결"은 응용 프로그램에 코드를 포함시키는 프로세스입니다. 본질적으로 DLL은 동적 링크 라이브러리이므로 응용 프로그램의 디렉토리에있는 DLL을 포함하여 정적 링크가 아니기 때문에 동적입니다. 동적 인 채로 남아 있습니다. 응용 프로그램의 디렉토리에 배치하는 이유는 응용 프로그램을 설치하지 않고도 찾을 수 있기 때문입니다.

"손상되었습니다"DLL은 아닙니다. 정적 인 DLL을 응용 프로그램에 정적으로 연결하려고 시도한 것으로 의심됩니다. 대신 올바른 .lib 파일을 링크 할 추가 라이브러리에 포함하고 링크 할 lib 파일이 wininet.dll의 DLL 내보내기 패키지가 아니어야합니다.

3

DLL과 직접 연결하면 안됩니다. 대신 해당 가져 오기 라이브러리에 연결하십시오 (Wininet.lib이어야 함). DLL은 물론 런타임에 응용 프로그램에 액세스 할 수 있어야합니다. .lib 파일은 DLL에 대한 적절한 연결을 설정하기 위해 링커에서 필요합니다.

정적으로 함수 호출과 DLL을 연결한다고 생각합니까?

일반적으로 동적 연결 (다소 동적 인 ..)이 있지만 Windows 시스템 API를 사용하는 유일한 방법은 afaik입니다. '정적'연결은 Wininet 코드를 외부 DLL 없이도 실행 파일에 직접 포함시킵니다.

1

DLL에는 함수에 대한 올바른 연결을 설정하는 데 사용할 해당 LIB 파일이 있습니다. 예를 들어, USER32.DLL 및 KERNEL32.DLL을 사용하는 경우 USER32.LIB와 KERNEL32.LIB가 링크되어야하는 해당 LIB입니다.

때로는 그렇게 명확하지 않습니다. 문제의 기능에 대해 MSDN을 살펴보고 두 번 확인해 볼 수 있습니다. 아래쪽으로 스크롤하면 링크 할 라이브러리, 예를 들어, Win32API의 CreateProcess을 살펴보면 페이지 맨 아래에서 사용할 라이브러리가 무엇인지 알 수 있습니다.이 경우 KERNEL32.LIB입니다.

링커 단계에서 링커가 이미 컴파일 된 라이브러리이므로 DLL을 이해할 수 없으므로 링커가 DLL이 "손상됨"이라고 불만을 나타 냈습니다.

WinInet.LIB로 변경하고 모두 확인해야합니다.

호프가 도움이 되었으면 안녕하세요, 탐.

+0

예, 많이 배우고 있습니다. 감사합니다. –

관련 문제