stephen_young
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1490回复:7

(已解决)求教:为什么ReadFile封装在DLL里会失败(附代码)。

楼主#
更多 发布于:2004-11-04 16:15
    我将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]
三人行必有我师!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-05 13:36
驱动没有处理好吧
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
stephen_young
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-05 13:59
我再看看驱动有没有问题。
另外,AllenZh,很久没有在msn上看到你了 :)
三人行必有我师!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-05 14:40
我再看看驱动有没有问题。
另外,AllenZh,很久没有在msn上看到你了 :)

最近有点忙
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
stephen_young
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-05 18:18
这个问题解决了。真是惭愧,错误竟然是ReadFile的第三个参数赋错了值。
我将数组的sizeof值传给了ReadFile的第三个参数,结果我误认为sizeof是数组的元素数,实际上是字节数,所以ReadFile就返回了错误。
三人行必有我师!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-05 18:28
这个问题解决了。真是惭愧,错误竟然是ReadFile的第三个参数赋错了值。
我将数组的sizeof值传给了ReadFile的第三个参数,结果我误认为sizeof是数组的元素数,实际上是字节数,所以ReadFile就返回了错误。
 

这样的低级错误我以前也经常犯
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
jerrygod
驱动牛犊
驱动牛犊
  • 注册日期2004-09-13
  • 最后登录2006-07-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-25 10:23
stephen_young兄:
  你在中断服务程序中将LOCAL INTERRUPT INPUT使能了,即OUT(PCIBASE+INTCSR,409000),倘若此时LOCAL BUS准备好数据要传输,发了一个中断,则将立刻再次进入中断服务程序,在那里通过位检测,将举起一个事件,进入下次DMA(从你的程序来看),那么本次DMA的完成并未结束,对传输不会构成影响吗?

  小弟窃以为应该放在DMA传输结束处,打开LOCAL INTERRUPT INPUT,你以为呢?期盼你的答复,谢谢
kkkyyy2004
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2007-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-29 16:12
我也曾遇到过类似的问题,谢谢
游客

返回顶部