阅读:1490回复:7
(已解决)求教:为什么ReadFile封装在DLL里会失败(附代码)。
我将pci驱动与应用程序的借口部分封装在一个dll里(MFC 正规DLL)。谁知打开设备,将参数传给驱动这些功能都可以。就是调用ReadFile启动Dma获取数据时ReadFile立即返回0――即无法读取。
不知道这里有何玄机? 我的代码如下: extern "C"__declspec(dllexport) BOOL D9054_Start_Trans( T* Buffer, ULONG nSize, ULONG& nRetBytes /*返回字节数*/) // { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ASSERT( Buffer && nSize ); ////////给信号///// if( !bIsRecord && !bIsStop ) { m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if( m_hEvent==NULL) { CloseHandle(m_hDevice); return FALSE; } TRACE("事件已经生成。n"); ULONG nRet = 0; if ( !DeviceIoControl( m_hDevice, EVENT_SET, &m_hEvent, sizeof(m_hEvent), NULL, 0, &nRet, NULL )) { CloseHandle(m_hDevice); CloseHandle(m_hEvent); return FALSE ; } TRACE(" 事件已经启动. n"); bIsRecord = TRUE; } bIsStop = FALSE; /////// 等信号 ///// while (WaitForSingleObject(m_hEvent, 0) != WAIT_OBJECT_0) { if ( !bIsRecord ) { TRACE("终止1。n"); return FALSE ; } } if( !ReadFile( m_hDevice, Buffer, nSize*sizeof(T*), &nRetBytes, NULL) ) { CloseHandle(m_hDevice); CloseHandle(m_hEvent); bIsRecord = FALSE; return FALSE; } return TRUE; } [编辑 - 11/5/04 by stephen_young] |
|
|
沙发#
发布于:2004-11-05 13:36
驱动没有处理好吧
|
|
|
板凳#
发布于:2004-11-05 13:59
我再看看驱动有没有问题。
另外,AllenZh,很久没有在msn上看到你了 :) |
|
|
地板#
发布于:2004-11-05 14:40
我再看看驱动有没有问题。 最近有点忙 |
|
|
地下室#
发布于:2004-11-05 18:18
这个问题解决了。真是惭愧,错误竟然是ReadFile的第三个参数赋错了值。
我将数组的sizeof值传给了ReadFile的第三个参数,结果我误认为sizeof是数组的元素数,实际上是字节数,所以ReadFile就返回了错误。 |
|
|
5楼#
发布于:2004-11-05 18:28
这个问题解决了。真是惭愧,错误竟然是ReadFile的第三个参数赋错了值。 这样的低级错误我以前也经常犯 |
|
|
6楼#
发布于:2004-11-25 10:23
stephen_young兄:
你在中断服务程序中将LOCAL INTERRUPT INPUT使能了,即OUT(PCIBASE+INTCSR,409000),倘若此时LOCAL BUS准备好数据要传输,发了一个中断,则将立刻再次进入中断服务程序,在那里通过位检测,将举起一个事件,进入下次DMA(从你的程序来看),那么本次DMA的完成并未结束,对传输不会构成影响吗? 小弟窃以为应该放在DMA传输结束处,打开LOCAL INTERRUPT INPUT,你以为呢?期盼你的答复,谢谢 |
|
7楼#
发布于:2004-11-29 16:12
我也曾遇到过类似的问题,谢谢
|
|