2010-07-20 6 views
0

J'ai hérité de la maintenance pour un programme qui interroge actuellement une base de données ADODB à partir de son remplacement CView::OnBeginPrinting. Toutefois, lorsque le handle de base de données ADODB est un proxy pour une connexion de base de données hors processus, il se bloque fréquemment. Apparemment, en attendant une réponse RPC, un message de peinture l'oblige à réintégrer le traitement de rendu de CView. .Utilisation de COM RPC depuis CView :: OnBeginPrinting

Existe-t-il un moyen d'utiliser en toute sécurité les objets COM hors processus à partir de CView::OnBeginPrinting? Par exemple, si je pouvais bloquer les messages de fenêtre à la fenêtre en question jusqu'à ce que l'appel COM terminé, ce serait probablement ...

Voici une trace de la pile de l'endroit où l'assertion se produit:

mfc100d.dll!CPreviewDC::ReleaseOutputDC() Line 138 C++ (asserts here) 
mfc100d.dll!CPreviewView::OnDraw(CDC * pDC) Line 801 C++ 
mfc100d.dll!CView::OnPaint() Line 189 C++ 
mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2354 C++ 
mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2067 + 0x20 bytes C++ 
mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 248 + 0x1c bytes C++ 
mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 411 C++ 
mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 420 + 0x15 bytes C++ 
[email protected]() + 0x28 bytes 
[email protected]() + 0xa2 bytes 
[email protected]() + 0x4b bytes  
[email protected]() + 0x24 bytes 
[email protected]() + 0x2e bytes 
[email protected]() + 0xc bytes 
[email protected]() + 0xf bytes 
mfc100d.dll!COleMessageFilter::OnMessagePending(const tagMSG * __formal) Line 114 C++ 
mfc100d.dll!COleMessageFilter::XMessageFilter::MessagePending(HTASK__ * htaskCallee, unsigned long dwTickCount, unsigned long __formal) Line 312 C++ 
ole32.dll!CCliModalLoop::HandlePendingMessage() + 0x91de bytes 
ole32.dll!CCliModalLoop::HandleWakeForMsg() + 0x46 bytes 
ole32.dll!CCliModalLoop::BlockFn() - 0x34d92 bytes 
ole32.dll!ModalLoop() + 0x5b bytes 
ole32.dll!ThreadSendReceive() + 0x36c bytes  
ole32.dll!CRpcChannelBuffer::SwitchAptAndDispatchCall() + 0x4d bytes 
ole32.dll!CRpcChannelBuffer::SendReceive2() + 0x8d bytes 
ole32.dll!CCliModalLoop::SendReceive() + 0x1e bytes  
ole32.dll!CAptRpcChnl::SendReceive() + 0x1a25 bytes  
ole32.dll!CCtxComChnl::SendReceive() + 0x47 bytes 
[email protected]() + 0x40 bytes 
rpcrt4.dll!_NdrClientCall2() - 0xa83 bytes 
[email protected]() + 0x5d bytes 
[email protected]() + 0xf bytes 
ole32.dll!CStdMarshal::Begin_RemQIAndUnmarshal1() + 0x91 bytes 
ole32.dll!CStdMarshal::Begin_QueryRemoteInterfaces() + 0x46 bytes 
ole32.dll!CStdMarshal::QueryRemoteInterfaces() + 0x37 bytes  
ole32.dll!CStdIdentity::CInternalUnk::QueryMultipleInterfaces() - 0x2adf0 bytes  
ole32.dll!CStdIdentity::CInternalUnk::QueryInterface() + 0x30 bytes  
[email protected]() + 0x16 bytes  
jscript.dll!VAR::SetHeapObject() + 0x31 bytes 
jscript.dll!VAR::Import() + 0x45d bytes  
jscript.dll!VarList::ImportVar() + 0x2e bytes 
jscript.dll!VarList::ImportRgvar() - 0x160fb bytes 
jscript.dll!CSession::Execute() + 0xd6 bytes 
jscript.dll!NameTbl::InvokeDef() + 0x146 bytes 
jscript.dll!NameTbl::InvokeEx() - 0x42f bytes 
jscript.dll!IDispatchExInvokeEx2() + 0x8e bytes  
jscript.dll!IDispatchExInvokeEx() + 0x4f bytes 
jscript.dll!NameTbl::InvokeEx() - 0x18653 bytes  
msscript.ocx!CScriptControl::ModuleRun() + 0x171 bytes 
msscript.ocx!CScriptControl::Run() + 0x5d bytes  
[several levels of my code, which I cannot reveal] 
myapp.exe!MyView::OnBeginPrinting(CDC * pDC, CPrintInfo * pInfo) Line 92 C++ 
mfc100d.dll!CPreviewView::SetPrintView(CView * pPrintView) Line 370 C++ 
mfc100d.dll!CView::DoPrintPreview(unsigned int nIDResource, CView * pPrintView, CRuntimeClass * pPreviewViewClass, CPrintPreviewState * pState) Line 218 + 0xc bytes C++ 
mfc100d.dll!AFXPrintPreview(CView * pView) Line 298 + 0x1b bytes C++ 
+0

Avez-vous réellement vu que la méthode est réentrée? – sharptooth

+0

'OnBeginPrinting' lui-même n'est pas ressaisi, mais il entre dans' CPreviewView :: OnDraw', puis s'affirme dans 'CPreviewDC :: ReleaseOutputDC' car' m_hDC' est nul. – bdonlan

Répondre

0

En la fin, j'ai fini par dériver de CPreviewView comme décrit dans TN030, et en supprimant les messages WM_DRAW pendant que j'étais occupé à faire des RPC. Je ne peux pas dire que je suis trop heureux de cette solution, mais cela semble fonctionner.

Questions connexes