2012-01-26 2 views
2

Windows Vista 이상에서 CancelIoEx을 호출하고 (지원되는 경우) Windows XP에서 다른 작업을 수행하는 응용 프로그램을 만들고 싶습니다.운영 체제에서 지원하는 경우 조건부로 함수를 실행하는 방법은 무엇입니까?

  1. Windows 7에서 응용 프로그램을 컴파일했지만 Windows XP에서 실행하면 어떻게됩니까? 런타임시 어떤 일이 발생합니까? 로드 오류가 발생합니까?

  2. 런타임시 사용되는 운영 체제에 따라 응용 프로그램에서 코드 경로 또는 다른 코드 경로 (로드 오류 방지)를 선택하도록하려면 어떻게합니까? 샘플 코드를 입력하십시오.

UPDATE는 : DLL이 Windows XP에서 존재하지만 함수가하지 않습니다.

+0

가능한 중복 http://stackoverflow.com/questions/1388388/ : 포인터를 일단 당신이 정상적으로 호출 할 수 있습니다 (한 번만 위를 할 필요) 지연로드 dll) –

+0

@ GregHewgill,이 경우에는 지연로드가 적절하지 않습니다 (동적로드입니다). 그 외에도, # 1이 다루어지지 않았기 때문에 정확한 복제본이 아니며 # 2에서 어떤 OS가 실행되고 있는지 감지 할 수있는 방법이 명확하지 않기 때문에 믿습니다. – Gili

+1

OS를 탐지하는 방법은 특정 OS를 탐지하는 것이 아니라 DLL을로드하려고 시도하는 것입니다. 버전 감지가 아닌 기능 감지가 필요합니다. 이 기능은 다음 문서에서 설명합니다. http://msdn.microsoft.com/en-us/library/151kt790.aspx –

답변

2

예, 존재하지 않는 DLL 내보내기를 참조하는 응용 프로그램은로드되지 않습니다.

OS 버전에 따라 다른 경로를 사용하는 코드를 추가해도 도움이되지 않습니다. 왜냐하면 존재하지 않는 함수에 대한 참조가 남아 있기 때문입니다.

대신 실행시 참조를 해결해야합니다.

하나의 옵션은 지연로드 가져 오기 (/DELAYLOAD 링커 플래그 포함)이지만, 핵심 시스템 DLL (kernel32와 같은)에 대해서는 지원되지 않는다고 생각합니다.

다른 하나는 LoadLibraryGetProcAddress입니다. 이 코드는 이와 비슷하지만 실제로 함수를 호출 할 때가 아니라 앱이 시작될 때 한 번 조회 할 수 있습니다. 런타임에 기호를 해결하기 위해

// 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 
} 
+0

우수 답변. 고맙습니다! – Gili

1

, 당신은 LoadLibraryGetProcAddress를 사용해야합니다 : CancelIoEx을 사용할 수 없음을 경우

HMODULE kernel32 = LoadLibrary("kernel32.dll"); 
BOOL (WINAPI *pCancelIoEx)(HANDLE, LPOVERLAPPED) = GetProcAddress(kernel32, "CancelIoEx"); 

, 당신은 GetProcAddress에서 다시 NULL을 얻을 것이다.

pCancelIoEx(h, &lp); 
[지연로드 된 DLL (의
관련 문제