📄 class.c
字号:
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 + -