VC++编程常见问题解答十三 问:如何使用COleClientItem的IDispatch接口? 我创建了一个如何使用COleClientItem对象,我想使用它的自动化方法.有什么 方 法来获得IDispatch的接口?我试过以CCmdTarget为基类的的GetIDispatch函数 但 却出错,我用过EnableAutomation和GetIDispatch,却什么也没得到. 答:MSDN中有一篇关于这个的文章(TN039).如下的代码也可能是你所需要的: LPDISPATCH CMyClientItem::GetIDispatch() { ASSERT_VALID(this); ASSERT(m_lpObject != NULL); LPUNKNOWN lpUnk = m_lpObject; Run(); // must be running LPOLELINK lpOleLink = NULL; if (m_lpObject->QueryInterface(IID_IOleLink, (LPVOID FAR*)&lpOleLink) == NOERROR) { ASSERT(lpOleLink != NULL); lpUnk = NULL; if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR) { TRACE0("Warning: Link is not connected!\n"); lpOleLink->Release(); return NULL; } ASSERT(lpUnk != NULL); } LPDISPATCH lpDispatch = NULL; if (lpUnk->QueryInterface(IID_IDispatch, &lpDispatch) != NOERROR) { TRACE0("Warning: does not support IDispatch!\n"); return NULL; } ASSERT(lpDispatch != NULL); return lpDispatch; } 问:关于用户自定义的消息使用? 我写了一个基于MFC应用程序的对话框,在这个程序中,我创建了等待网络传输数据 的线程,一旦该线程接收到数据,它就传送一个用户自定义的消息到对话框,使对话 框知道有数据过来.但是为何在CMyDialog::PreTranslateMessage(MSG* pMsg)中 能 捕捉到WM_MYCMD这个消息,却不能和OnMyCommand相映射? 答:将你所有自定义消息的基类设为WM_APP,而不是WM_USER. 问:在打开一个文档时退出? 我有一个mdi程序,在打开文件的处理过程中,我想判断该文档是不是应用程序需要 处理的文档,因此,我检测文档中的某个数字是否符合要求,如何在发现不是该文档 时出现一个错误提示,然后不打开该文档? 答:给文档设定某个标志,如果文档不是所要的就设定它.然后OnOpenDocument中 检测, 当发现标志被设定后返回FALSE. 问:在CListCtrl控件中多选择项的删除? 如何从在CListCtrl中删除多个选择项? 答:按如下方法处理: 假定你的CListCtrl是m_list,to_delete是个整数数组. i=3D0; POSITION pos=3Dm_list.GetFirstSelectedItemPosition(); if(pos) while(pos) to_delete[i++]=3Dm_list.GetNextSelectedItem(pos); 然后用删除保存在to_delete中的项目,用GetSelectedCount来得到已选项的个数. 问:工作线程的登录状态? 我使用循环删除了用AfxBeginThread创建的线程的好几个实例.每个线程打开一个 iNET连接,打开一个URL并返回结果.我需要找出哪一个或者何时这些线程进入到登 录状态. 答:按如下方法处理:(伪代码) // Start Threads for( unsigned u = 0; u < NUMBER_OF_THREADS; u++ ) { ThreadHandleArray[ u ] = AfxBeginThread( ...... )->m_hThread; } DWORD count = NUMBER_OF_THREADS DWORD dwWait; while( count ) { dwWait = ::WaitForMultipleObjects( count, ThreadHandleArray, FALSE,INFINITE ); if( dwWait >= WAIT_OBJECT_0 && dwWait < ( WAIT_OBJECT_0 + count ) ) { dwWait -= WAIT_OBJECT_0; // dwWait now has index to thread that completed do whateveryou want to do with it // set array back up for next wait if( dwWait != ( count - 1 ) ) ThreadHandleArray[ dwWait ] = ThreadHandleArray[count - 1 ]; count--; } }