2009년 4월 10일 금요일

Wtsapi32.dll 오류 해결(windows 2000 pro)

 

windows 2000 professional 에서 Wtsapi32.dll 오류가 발생 하는 경우 십중 팔구 Wtsapi32.lib를 정적으로 링크해서 컴파일한 프로그램들이다.

WTSGetActiveConsoleSessionId 및 WTSQueryUserToken 따위의 함수들이 xp, vista 이상만 지원 하고 하위 버전 호환이 안되기 때문에 발생 하는 듯 하다.

이럴땐 아래 처럼 Loadlibrary 처리하면 오류를 해결 할 수 있다.

BOOL bRes = FALSE;

char lpPath[MAX_PATH];

DWORD RetVal                 = 0;

DWORD ErrCode = 0;

DWORD ConsoleSessionId = 0;

 

HMODULE hInstKernel32 = NULL;

HMODULE hInstWtsapi32 = NULL;

 

HANDLE hTokenUser = NULL;

HANDLE hTokenThisProcess = NULL;

HANDLE hTokenThis = NULL;

 

typedef DWORD (WINAPI *WTSGetActiveConsoleSessionIdPROC)();

WTSGetActiveConsoleSessionIdPROC WTSGetActiveConsoleSessionId = NULL;

hInstKernel32 = LoadLibrary("Kernel32.dll");

if (!hInstKernel32)

{

return FALSE;

}

WTSGetActiveConsoleSessionId = (WTSGetActiveConsoleSessionIdPROC)GetProcAddress(hInstKernel32,"WTSGetActiveConsoleSessionId");

if (!WTSGetActiveConsoleSessionId)

{

return FALSE;

}

 

typedef BOOL (WINAPI *WTSQueryUserTokenPROC)(ULONG SessionId, PHANDLE phToken );

WTSQueryUserTokenPROC WTSQueryUserToken = NULL;

hInstWtsapi32 = LoadLibrary("Wtsapi32.dll");

if (!hInstWtsapi32)

{

return FALSE;

}

WTSQueryUserToken = (WTSQueryUserTokenPROC)GetProcAddress(hInstWtsapi32,"WTSQueryUserToken");

if (!WTSQueryUserToken)

{

return FALSE;

}

 

ConsoleSessionId = WTSGetActiveConsoleSessionId();

 

bRes = WTSQueryUserToken( ConsoleSessionId, &hTokenUser);

if (!bRes)

{

return FALSE;

}

 

bRes = ImpersonateLoggedOnUser(hTokenUser);

if (!bRes)

{

return FALSE;

}

bRes = SHGetSpecialFolderPath(NULL,lpPath,CSIDL_STARTUP,TRUE);

if (!bRes)

{

return FALSE;

}

else

{

MessageBox(NULL,lpPath,"Startup",MB_OK);

}

RevertToSelf();

댓글 없음: