各位老大:
在进入CE系统后,在桌面上单击右键(或长按触摸屏),会出现显示属性,显示属性的第二项为“背光灯”
在背光灯的显示框中有个“高级...”的按键,单击这个按键会显示调节背光的“背光设置”,点“OK”退出。
......
问题出现了:
在“背光灯”的显示框中,如果先点击了下拉框选择超时时间“1分钟,2分钟.....”之后,
再点击“高级...”的这个按键,则“背光设置”这个对话框就出现不了了
在串口的打印信息为:
Prefetch Abort: Thread=9e2269c4 Proc=96c292d0 'ctlpnl.exe'
AKY=00000041 PC=02b912fc RA=0321655c BVA=02b912fc FSR=000004f0
请问各位高手这个问题是什么所导致,有什么办法可以解决??
谢谢各位
背光设置后如果会正常关闭,说明bsp的显示驱动没什么问题,那么就是你的系统定制的问题了。
“背光设置”应该在控制面板里
个人觉得这个问题跟BSP的显示没太大关系
在“背光灯”的显示框中,如果先点击了下拉框选择超时时间“1分钟,2分钟.....”之后,
再点击“高级...”的这个按键,则“背光设置”这个对话框就出现不了了
各位没有人遇到跟我相似的问题吗
控制面板关于背光调节的代码在 D:\WINCE420\PUBLIC\WCESHELLFE\OAK\CTLPNL\CPLMAIN中Screen.cpp
里面extern "C" BOOL APIENTRY BacklightDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)这个函数中定义了调光相应的程序,其中
case WM_COMMAND:
switch (LOWORD(wParam))
case IDC_BADVANCED:
ASSERT(pfnAdvanced);
if(pfnAdvanced)
if( pfnAdvanced(hDlg) )
{
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_BACKLIGHTCHANGEEVENT);
if (hEvent != NULL) {
SetEvent(hEvent);
CloseHandle(hEvent);
}
} return TRUE;
为控制面板->显示->背光灯->“高级…”这个按键的相应函数
具体哪有问题现在没看出来!
用KTIL,联调以下,看看call stack,个人猜测是背光驱动的一些MDD接口没有写好的
我的BSP中有个导出DLL的文件,重写了一个
advbacklight回调函数:
BOOL DllEntry( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
int GetBkLightLevel(HWND hDlg)
void SetBkLightLevel( int iData, HWND hDlg )
BOOL BacklightAdvApplet( HWND hDlg )
BOOL CALLBACK AdvancedDlgProc(HWND hwndPage, UINT message, WPARAM wParam, LPARAM lParam)
并在注册表中添加了advbacklight.dll
然后让系统在screen.cpp中调用这个DLL中的BacklightAdvApplet函数
if(pszFileName && (hAdvanced = LoadLibrary(pszFileName))) {
pfnAdvanced = (ADVANCEDPROC)GetProcAddress(hAdvanced, FUNCNAME_BACKLIGHTADVAPPLET);
}
其中FUNCNAME_BACKLIGHTADVAPPLET定义:
#define FUNCNAME_BACKLIGHTADVAPPLET TEXT("BacklightAdvApplet")
并在screen.cpp中这段对按下《控制面板->显示->背光灯->“高级…”》这个按键的相应处理函数
case WM_COMMAND:
switch (LOWORD(wParam))
case IDC_BADVANCED:
ASSERT(pfnAdvanced);
if(pfnAdvanced)
if( pfnAdvanced(hDlg) )
{
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_BACKLIGHTCHANGEEVENT); if (hEvent != NULL) {
SetEvent(hEvent);
CloseHandle(hEvent);
}
} return TRUE;
这段中创建了一个事件
其中EVENTNAME_BACKLIGHTCHANGEEVENT的定义:
//This is the event we signal when the backlight settings change.
#define EVENTNAME_BACKLIGHTCHANGEEVENT TEXT("BackLightChangeEvent")
请问:
1、这个事件HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_BACKLIGHTCHANGEEVENT); 一定是在什么地方被挂起等待被触发
应该是在哪被挂起的??这个一直没找到!
2、创建事件之后,程序就SetEvent(hEvent);
所以我猜想是不是在WaitForSignleObject(xxx,hEvent)
后需要ResetEvent(hEvent),而程序中没有ResetEvent,所以才导致出现
这样的打印信息:
Prefetch Abort: Thread=9e2269c4 Proc=96c292d0 'ctlpnl.exe'
AKY=00000041 PC=02b912fc RA=0321655c BVA=02b912fc FSR=000004f0
我的BSP中有个导出DLL的文件,重写了一个
advbacklight回调函数:
BOOL DllEntry( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
int GetBkLightLevel(HWND hDlg)
void SetBkLightLevel( int iData, HWND hDlg )
BOOL BacklightAdvApplet( HWND hDlg )
BOOL CALLBACK AdvancedDlgProc(HWND hwndPage, UINT message, WPARAM wParam, LPARAM lParam)
并在注册表中添加了advbacklight.dll
然后让系统在screen.cpp中调用这个DLL中的BacklightAdvApplet函数 :
if(pszFileName && (hAdvanced = LoadLibrary(pszFileName))) {
pfnAdvanced = (ADVANCEDPROC)GetProcAddress(hAdvanced, FUNCNAME_BACKLIGHTADVAPPLET);
}
其中FUNCNAME_BACKLIGHTADVAPPLET定义:
#define FUNCNAME_BACKLIGHTADVAPPLET TEXT("BacklightAdvApplet")
并在screen.cpp中这段对按下《控制面板->显示->背光灯->“高级…”》这个按键的相应处理函数
case WM_COMMAND:
switch (LOWORD(wParam))
case IDC_BADVANCED:
ASSERT(pfnAdvanced);
if(pfnAdvanced)
if( pfnAdvanced(hDlg) )
{
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_BACKLIGHTCHANGEEVENT); if (hEvent != NULL)
{
SetEvent(hEvent);
CloseHandle(hEvent);
}
} return TRUE;
这段中创建了一个事件
其中EVENTNAME_BACKLIGHTCHANGEEVENT的定义:
//This is the event we signal when the backlight settings change.
#define EVENTNAME_BACKLIGHTCHANGEEVENT TEXT("BackLightChangeEvent")
请问:
1、这个事件HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, EVENTNAME_BACKLIGHTCHANGEEVENT); 一定是在什么地方被挂起等待被触发
应该是在哪被挂起的??这个一直没找到!
2、创建事件之后,程序就马上SetEvent(hEvent);
所以我猜想是不是在WaitForSignleObject(xxx,hEvent)
后需要ResetEvent(hEvent),而程序中没有ResetEvent,所以才导致出现
这样的打印信息:
Prefetch Abort: Thread=9e2269c4 Proc=96c292d0 'ctlpnl.exe'
AKY=00000041 PC=02b912fc RA=0321655c BVA=02b912fc FSR=000004f0
则“背光设置”这个对话框就出现不了了
这个跟硬件没有关系把。。。。。背光设置在控制面板里面应该还是有吧。。。。
引用: 引用 6 楼 wangxin_801115 的回复:
我的BSP中有个导出DLL的文件,重写了一个
advbacklight回调函数:
BOOL DllEntry( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
int GetBkLightLevel(HWND hDlg)
void SetBkLightLevel( int iData, HWND hDlg )
BOOL BacklightAdvApplet( HWND hDlg )
BOOL CALLBACK AdvancedDlgProc(HWND hwndPage, UINT message, WPARAM wParam, LPARAM lP…
CreateEvent的第二个参数是FALSE,也就是不需要手动reset,所以ResetEvent。
楼主还是不要乱怀疑,虽然出错的是在MS的代码里,但是还是会有有BSP的代码牵涉,所以还是把出错的现场call stack都dump出来比较容易来解决问题。
搞定!
原来按了下拉框或就
case WM_DESTROY:
MyFreeLib(hAdvanced);
break;
在高级按键的响应函数下重新再调用一遍DLL就没问题了!
感谢各位!