⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
					LPDWORD lpExtra = (LPDWORD)(&lpwc->wc + 1);
					dwOldValue = lpExtra[nIndex/4];
					lpExtra[nIndex/4] = lNewValue;
					break;
				}

                ASSERT( 0 );
				WARNMSG( DEBUG_CLASS_SETLONG, ( "error: SetClassLong not support the index=%x.\r\n", nIndex ) );
				dwErrorCode = ERROR_INVALID_PARAMETER;
                break;
			}
		}
	}
	else
		dwErrorCode = ERROR_INVALID_PARAMETER;
	SetLastError( dwErrorCode );
    return dwOldValue;
}

// **************************************************
// 声明:BOOL WINAPI WinClass_GetInfo( HINSTANCE hInstance , LPCSTR lpClassName, LPWNDCLASS lpWndClass )
// 参数:
//	IN hInstance-实例句柄
//	IN lpcClassName-类名
//	IN lpwc-WNDCLASS结构指针
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	得到类信息
// 引用: 
//	系统API
// ************************************************

BOOL WINAPI WinClass_GetInfo( HINSTANCE hInstance , LPCSTR lpClassName, LPWNDCLASS lpWndClass )
{
    _LPREGCLASS p;

	HANDLE hCallerProcess = GetCallerProcess();

	p = _FindClass( lpClassName, hCallerProcess, hInstance, NULL, NULL );
    if( p )
        *lpWndClass = *(&p->wc);
    return p ? TRUE : FALSE;
}

// **************************************************
// 声明:int WINAPI WinClass_Unregister( LPCSTR lpcClassName, HINSTANCE hInstance )
// 参数:
// 	IN lpcClassName-类名
//	IN hInstance-实例句柄
// 返回值:
//	假如成功,返回非零;否则,返回0
// 功能描述:
//	注销窗口类
// 引用: 
//	系统API
// ************************************************

int WINAPI WinClass_Unregister( LPCSTR lpcClassName, HINSTANCE hInstance )
{
    _LPREGCLASS lpPrev;
	_LPREGCLASS p;
    _LPPROCESS_CLASS lpProcessList;
	BOOL bRetv = FALSE;

	HANDLE hCallerProcess = GetCallerProcess();

	EnterCriticalSection( &csWndClass );
	//查找匹配的窗口类	
	p = _FindClass( lpcClassName, hCallerProcess, hInstance, &lpProcessList, &lpPrev );

	if( p && p->nRefCount == 0 )
    {   //有效并且引用计数为0
		p->objType = OBJ_NULL;
		//从链表中移出
		if( lpPrev )
			lpPrev->lpNext = p->lpNext;
		else
			lpProcessList->lpRegClass = p->lpNext;
		//删除之前分配的资源
		if( p->wc.hbrBackground )
		    DeleteObject( p->wc.hbrBackground );
		if( p->wc.hCursor )
			WinGdi_DestroyCursor( p->wc.hCursor );
		if( p->wc.hIcon )
			WinGdi_DestroyIcon( p->wc.hIcon );
		FreeClassStruct( p );
        bRetv = TRUE;
    }
	LeaveCriticalSection( &csWndClass );
    return bRetv;
}

// **************************************************
// 声明:BOOL AddClassRef( _LPREGCLASS lpClass )
// 参数:
// 	IN lpClass - _REGCLASS 结构指针
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	增加对类的引用计数
// 引用: 
//	
// ************************************************

BOOL AddClassRef( _LPREGCLASS lpClass )
{
	ASSERT( lpClass->objType == OBJ_CLASS );
	if( lpClass && lpClass->objType == OBJ_CLASS )
	{
		Interlock_Increment( (LPLONG)&lpClass->nRefCount );
		return TRUE;
	}
	return FALSE;
}

// **************************************************
// 声明:BOOL DecClassRef( _LPREGCLASS lpClass )
// 参数:
// 	IN lpClass - _REGCLASS 结构指针
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	与 AddClassRef 相反,减少对类的引用计数
// 引用: 
//	
// ************************************************

BOOL DecClassRef( _LPREGCLASS lpClass )
{
	ASSERT( lpClass->objType == OBJ_CLASS );
	if( lpClass && lpClass->objType == OBJ_CLASS && lpClass->nRefCount )
	{
		Interlock_Decrement( (LPLONG)&lpClass->nRefCount );
		return TRUE;
	}
	return FALSE;
}

// **************************************************
// 声明:_LPREGCLASS GetClassPtr( LPCSTR lpcClassName, HINSTANCE hInstance )
// 参数:
// 	IN lpcClassName - 类名
//	IN hInstance - 实例句柄
// 返回值:
//	假如成功,返回注册的类对象指针;否则,返回NULL
// 功能描述:
//	查找并返回 类名对应的 类对象指针
// 引用: 
//	
// ************************************************

_LPREGCLASS GetClassPtr( LPCSTR lpcClassName, HINSTANCE hInstance )
{
	_LPREGCLASS p;
	//得到呼叫者进程
	HANDLE hCallerProcess = GetCallerProcess();
	//查找进程里是否存在该类
	p = _FindClass( lpcClassName, hCallerProcess, hInstance, NULL, NULL );

	if( p == NULL )
	{	//没有找到,查找系统类
		extern HINSTANCE hgwmeInst;
		p = _FindClass( lpcClassName, hgwmeProcess, hgwmeInstance, NULL, NULL ); // find in gabol
	}
	return p;

}

// **************************************************
// 声明:static BOOL ClearProcessClass( _LPPROCESS_CLASS lpProcessList )
// 参数:
// 	IN lpProcessList - _PROCESS_CLASS 结构指针
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	释放所有属于进程的之前已经注册的类
// 引用: 
//	当进程退出后,清除该进程的类
// ************************************************

#define DEBUG_CLEAR_PROCESS_CLASS 0

static BOOL ClearProcessClass( _LPPROCESS_CLASS lpProcessList )
{
	_LPREGCLASS lpNext;
	_LPREGCLASS p = lpProcessList->lpRegClass;

    //EnterCriticalSection( &csWndClass );
	lpProcessList->lpRegClass = NULL;

	lpNext = NULL;
	while( p )
	{
		if( p->nRefCount )
		{
			EdbgOutputDebugString( "Fatal Error: not free all refrence window class!!!" );
		}
		
		lpNext = p->lpNext;
		
		//          释放类资源
		if( p->wc.hbrBackground )
			WinGdi_DeleteObject( p->wc.hbrBackground );
		if( p->wc.hCursor )
			WinGdi_DestroyCursor( p->wc.hCursor );
		if( p->wc.hIcon )
			WinGdi_DestroyIcon( p->wc.hIcon );
		p->objType = OBJ_NULL;
		FreeClassStruct( p );
		p = lpNext;
	}
	
	//LeaveCriticalSection( &csWndClass );

	return TRUE;
}

// **************************************************
// 声明:BOOL CALLBACK WinClass_Clear( HANDLE hOwnerProcess )
// 参数:
// 	IN hOwnerProcess - 拥有者进程句柄
// 返回值:
//	假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	释放所有属于进程的之前已经注册的类
// 引用: 
//	当进程退出后,清除该进程的类
// ************************************************

#define DEBUG_WINCLASS_CLEAR 0
BOOL CALLBACK WinClass_Clear( HANDLE hOwnerProcess )
{
	_LPPROCESS_CLASS lpPrev, p;

	if( !API_IsReady( API_GWE ) )
		return TRUE;	
	//进入冲突段
	EnterCriticalSection( &csWndClass );

	DEBUGMSG( DEBUG_WINCLASS_CLEAR, ( "Enter WinClass_Clear, hOwnerProcess=%x.\r\n", hOwnerProcess ) );

	p = lpProcessClassList;
	lpPrev = NULL;

	while( p )
	{	//是否属于进程拥有者
		if( p->hProcess == hOwnerProcess )
		{
			DEBUGMSG( DEBUG_WINCLASS_CLEAR, ( "WinClass_Clear:Find Process Class p=%x.\r\n", p ) );
			//清除
			ClearProcessClass( p );
			//从链表中清除
			if( p->lpRegClass == NULL )
			{
				if( lpPrev )
					lpPrev->lpNext = p->lpNext;
				else
					lpProcessClassList = p->lpNext;
				//释放结构
				BlockHeap_Free( hgwmeBlockHeap, 0, p, sizeof(_PROCESS_CLASS) );//free( p );
			}
			break;
		}
		lpPrev = p;
		p = p->lpNext;
	}
	DEBUGMSG( DEBUG_WINCLASS_CLEAR, ( "WinClass_Clear:Leave.\r\n" ) );

	LeaveCriticalSection( &csWndClass );
	return TRUE;
}


// **************************************************
// 声明:static _LPREGCLASS _FindClassInProcess( _LPREGCLASS p, LPCSTR lpClassName, HINSTANCE hInst, _LPREGCLASS * lpPrev )
// 参数:
// 	IN p - _REGCLASS结构指针
//	IN lpClassName - 需要匹配的类名
//	IN hInst - 实例句柄
//	OUT lpPrev - 用于保存已找到对象在链表中的前一个对象

// 返回值:
//	假如成功,返回_REGCLASS结构指针;否则,返回NULL
// 功能描述:
//	在进程类链表中发现 一个类
// 引用: 
//	
// ************************************************

static _LPREGCLASS _FindClassInProcess( _LPREGCLASS p, LPCSTR lpClassName, HINSTANCE hInst, _LPREGCLASS * lpPrev )
{
	while( p )
	{
		if( ( hInst == 0 || p->wc.hInstance == hInst ) && 
			stricmp( lpClassName, p->wc.lpszClassName ) == 0 )
		{	//找到
			return p;
		}
	    if( lpPrev )
		    *lpPrev = p;
		//下一个
		p = p->lpNext;
	}
	return NULL;
}

// **************************************************
// 声明:static _LPREGCLASS _FindClass( 
//								LPCSTR lpClassName,
//								HANDLE hOwnerProcess,
//								HINSTANCE hInst,
//								_LPPROCESS_CLASS * lppProcessClassList,
//								_LPREGCLASS * lpPrev
//							    )
// 参数:
//	IN lpClassName - 类名
//	IN hOwnerProcess - 进程句柄
//	IN hInst - 实例句柄
//	IN lppProcessClassList - 进程窗口类链表
//	OUT lpPrev - 用于保存前链表的前一个对象
// 返回值:
//	假如成功,返回 _REGCLASS 结构指针;否则,返回NULL
// 功能描述:
//	查找一个类,如果找到
// 引用: 
//	
// ************************************************
#define DEBUG_FIND_CLASS 0
static _LPREGCLASS _FindClass( LPCSTR lpClassName,
							   HANDLE hOwnerProcess,
							   HINSTANCE hInst,
							   _LPPROCESS_CLASS * lppProcessClassList,
							   _LPREGCLASS * lpPrev
							    )
{
	_LPPROCESS_CLASS p;
	_LPREGCLASS lpreg = NULL;

	ASSERT( lpClassName );
	//进入冲突段
	EnterCriticalSection( &csWndClass );

	DEBUGMSG( DEBUG_FIND_CLASS, ( "FindClass:Enter ClassName=%s,hOwnerProcess=%x.\r\n", lpClassName, hOwnerProcess ) );
	p = lpProcessClassList;
	if( lpPrev )
		*lpPrev = NULL;
	if( lppProcessClassList )
		*lppProcessClassList = NULL;

	while( p )
	{
		if( p->hProcess == hOwnerProcess )
		{	//匹配实例句柄
			if( ( lpreg = _FindClassInProcess( p->lpRegClass, lpClassName, hInst, lpPrev ) ) )
			{	//找到
				ASSERT( lpreg->hOwnerProcess == hOwnerProcess );
			    break;//return p;
			}
			//不匹配实例句柄
			lpreg = _FindClassInProcess( p->lpRegClass, lpClassName, 0, lpPrev );
			if( lppProcessClassList )
				*lppProcessClassList = p;
			break;
		}
		p = p->lpNext;
	}
	DEBUGMSG( DEBUG_FIND_CLASS, ( "_FindClass:Leave.\r\n" ) );

	LeaveCriticalSection( &csWndClass );
	return lpreg;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -