请教CE下背光调节的问题

anzx23   2008-9-24 16:38 楼主
各位老大:
    在进入CE系统后,在桌面上单击右键(或长按触摸屏),会出现显示属性,显示属性的第二项为“背光灯”
在背光灯的显示框中有个“高级...”的按键,单击这个按键会显示调节背光的“背光设置”,点“OK”退出。
......
问题出现了:
在“背光灯”的显示框中,如果先点击了下拉框选择超时时间“1分钟,2分钟.....”之后,
再点击“高级...”的这个按键,则“背光设置”这个对话框就出现不了了
在串口的打印信息为:
Prefetch Abort: Thread=9e2269c4 Proc=96c292d0 'ctlpnl.exe'
AKY=00000041 PC=02b912fc RA=0321655c BVA=02b912fc FSR=000004f0

请问各位高手这个问题是什么所导致,有什么办法可以解决??
谢谢各位

回复评论 (10)

背光设置后如果会正常关闭,说明bsp的显示驱动没什么问题,那么就是你的系统定制的问题了。
点赞  2008-9-24 17:29
“背光设置”应该在控制面板里
个人觉得这个问题跟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;
为控制面板->显示->背光灯->“高级…”这个按键的相应函数
具体哪有问题现在没看出来!
点赞  2008-9-24 17:48
背光驱动有问题。
点赞  2008-9-24 18:16
用KTIL,联调以下,看看call stack,个人猜测是背光驱动的一些MDD接口没有写好的
点赞  2008-9-24 18:28
我的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
点赞  2008-9-24 21:29
我的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
点赞  2008-9-24 21:32
顶起来
点赞  2008-9-25 09:20
则“背光设置”这个对话框就出现不了了

这个跟硬件没有关系把。。。。。背光设置在控制面板里面应该还是有吧。。。。
点赞  2008-9-25 10:04
引用: 引用 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出来比较容易来解决问题。
点赞  2008-9-25 10:17
搞定!
原来按了下拉框或就
case WM_DESTROY:
        MyFreeLib(hAdvanced);
        break;
在高级按键的响应函数下重新再调用一遍DLL就没问题了!
感谢各位!
点赞  2008-9-25 14:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复