记得08年刚做可视电话模块的时候,我们被Phone Canvas函数不返回RPC_E_WRONG_THREAD现象所迷惑,在H.324协议栈线程内调用了Phone Canvas函数导致cprog.exe创建了两个Progress View。结果两个Progress View交替显示,状态那叫一个混乱哟!
解决这个问题的方法,笔者已在《【WM】谈Phone Canvas函数为何不会返回错误值RPC_E_WRONG_THREAD》一文中给出,即:Phone Canvas函数需要在cprog.exe的UI线程上下文中调用,至于造成这个问题的原因将在本文中分析。
Phone Canvas的Dialer、Progress和SmartDialer视图都派生自同一个基类CProgressCommon,这个基类下面有个EnsureViewExists()方法:
在EnsureViewExists()方法内对视图的线程上下文进行了验证,如果视图不在当前线程上下文创建的,则重新创建视图。
因此,上述故障就很容易理解了:cprog.exe启动时UI线程创建了一个Progress视图,然后我们在H.324协议栈线程上下文间接调用了EnsureViewExists()方法又创建了一个Progress视图。