예, 존재하지 않는 DLL 내보내기를 참조하는 응용 프로그램은로드되지 않습니다.
OS 버전에 따라 다른 경로를 사용하는 코드를 추가해도 도움이되지 않습니다. 왜냐하면 존재하지 않는 함수에 대한 참조가 남아 있기 때문입니다.
대신 실행시 참조를 해결해야합니다.
하나의 옵션은 지연로드 가져 오기 (/DELAYLOAD
링커 플래그 포함)이지만, 핵심 시스템 DLL (kernel32와 같은)에 대해서는 지원되지 않는다고 생각합니다.
다른 하나는 LoadLibrary
과 GetProcAddress
입니다. 이 코드는 이와 비슷하지만 실제로 함수를 호출 할 때가 아니라 앱이 시작될 때 한 번 조회 할 수 있습니다. 런타임에 기호를 해결하기 위해
// Declare type of pointer to CancelIoEx function
typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);
// Load module; won't fail because it's already imported
HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");
// Look up function address
CancelIoExType pCancelIoEx = (CancelIoExType)GetProcAddress(hKernel32, "CancelIoEx");
// Do something with it
if (pCancelIoEx)
{
// Function exists so call it
pCancelIoEx(hMyFile, pMyOverlapped);
}
else
{
// Function doesn't exist
}
출처
2012-01-26 18:40:52
arx
가능한 중복 http://stackoverflow.com/questions/1388388/ : 포인터를 일단 당신이 정상적으로 호출 할 수 있습니다 (한 번만 위를 할 필요) 지연로드 dll) –
@ GregHewgill,이 경우에는 지연로드가 적절하지 않습니다 (동적로드입니다). 그 외에도, # 1이 다루어지지 않았기 때문에 정확한 복제본이 아니며 # 2에서 어떤 OS가 실행되고 있는지 감지 할 수있는 방법이 명확하지 않기 때문에 믿습니다. – Gili
OS를 탐지하는 방법은 특정 OS를 탐지하는 것이 아니라 DLL을로드하려고 시도하는 것입니다. 버전 감지가 아닌 기능 감지가 필요합니다. 이 기능은 다음 문서에서 설명합니다. http://msdn.microsoft.com/en-us/library/151kt790.aspx –