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();
댓글 없음:
댓글 쓰기