5485|12

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DeviceIoControl在应用程序和驱动程序传递参数的问题?? [复制链接]

WINCE5中,在应用程序中,单击一个按钮,然后在执行以下代码
void CDiscDlg::OnDiscCapture()
{
        // TODO: Add your control notification handler code here
        BYTE *pDisplayBuffer;
        DeviceIoControl(m_hCameraFile, CAM_IOCTL_SAMSUNG_CAM_PR, 0, 0, pDisplayBuffer, 1, 0, 0);



        CDC *pDC = GetDC();
        CDC bmpDC;
        CBitmap bitmap, *pOldBitmap;

        bitmap.CreateBitmap(320, 240, 1, 16, pDisplayBuffer);
        bmpDC.CreateCompatibleDC(pDC);
        pOldBitmap = bmpDC.SelectObject(&bitmap);
        pDC->BitBlt(0, 0, 320, 240, &bmpDC, 0, 0, SRCCOPY);
   
        bmpDC.SelectObject(pOldBitmap);
        bmpDC.DeleteDC();
        bitmap.DeleteObject();
}

在驱动程序中,CIS_IoControl中,定义了

BOOL CIS_IOControl(DWORD hOpenContext,
                                   DWORD dwCode,
                                   PBYTE pBufIn,
                                   DWORD dwLenIn,
                                   PBYTE pBufOut,
                                   DWORD dwLenOut,
                                   PDWORD pdwActualOut)
{
case CAM_IOCTL_SAMSUNG_CAM_PR:        // ID=0x522
                                RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM_PR\r\n")));
                                pBufOut = (PBYTE)0xa2ec3000;
                                break;
}

问题是:调试发现pDisplayBuffer的值不是0xa2ec3000,也就是没有把这个参数传成功,不知道为何?还有DeviceIoControl如果DeviceIoControl(m_hCameraFile, CAM_IOCTL_Movie_CAM_Start, 0, 0, 0, 0, 0, 0);是成功的,,,



另外#define CAM_IOCTL_SAMSUNG_CAM_PR  0x522

最新回复

3楼正解! 因为你要改pDisplayBuffer本身,所以要把它的地址传过去啊,否则函数会复制一个pDisplayBuffer再处理  详情 回复 发表于 2009-3-1 11:00
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
把DeviceIoControl( )看明白,看是怎么用的
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个函数,我用了很多次,都成功。我记得在我的博客写了一些要注意的地方。你去搜索一下。太多了,我也记不得在哪个标签下。

它和驱动的XXX_IOControl通信的,只要参数对应,就可以成功。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
这么用DeviceIoControl是错的。你得这么用:
应用程序中:
BYTE *pDisplayBuffer;
DeviceIoControl(m_hCameraFile, CAM_IOCTL_SAMSUNG_CAM_PR, 0, 0, &pDisplayBuffer, sizeof(BYTE*), 0, 0);
驱动程序中:
case CAM_IOCTL_SAMSUNG_CAM_PR: // ID=0x522
RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM_PR\r\n")));
*(DWORD*)pBufOut = 0xa2ec3000;
break;
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
HANDLE CreateFile(
    LPCTSTR lpFileName,                         // 文件名/设备路径
    DWORD dwDesiredAccess,                      // 访问方式
    DWORD dwShareMode,                          // 共享方式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符指针
    DWORD dwCreationDisposition,                // 创建方式
    DWORD dwFlagsAndAttributes,                 // 文件属性及标志
    HANDLE hTemplateFile                        // 模板文件的句柄
);
注意参数
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

6
 
错了。。
是这个
BOOL DeviceIoControl(
    HANDLE hDevice,              // 设备句柄
    DWORD dwIoControlCode,       // 控制码
    LPVOID lpInBuffer,           // 输入数据缓冲区指针
    DWORD nInBufferSize,         // 输入数据缓冲区长度
    LPVOID lpOutBuffer,          // 输出数据缓冲区指针
    DWORD nOutBufferSize,        // 输出数据缓冲区长度
    LPDWORD lpBytesReturned,     // 输出数据实际长度单元长度
    LPOVERLAPPED lpOverlapped    // 重叠操作结构指针
);
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

7
 
pDisplayBuffer, 1
有意思啊,参数回传0xa2ec3000,长度为1,肯定错了。长度为4试试
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 singlerace 的回复:
这么用DeviceIoControl是错的。你得这么用:
应用程序中:
BYTE *pDisplayBuffer;
DeviceIoControl(m_hCameraFile, CAM_IOCTL_SAMSUNG_CAM_PR, 0, 0, &pDisplayBuffer, sizeof(BYTE*), 0, 0);
驱动程序中:
case CAM_IOCTL_SAMSUNG_CAM_PR: // ID=0x522
RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM_PR\r\n")));
*(DWORD*)pBufOut = 0xa2ec3000;
break;

还是singlerace 厉害,一眼就看到问题的症结,不过我还不是很明白
1. *(DWORD*)pBufOut = 0xa2ec3000;
2. pBufOut = (PBYTE)0xa2ec3000;
之间的区别,1把pBufOut 强制转换为DWORD指针,然后给它赋值,
2是把0xa2ec3000强制转换为一个地址然后再赋给pBufOut ,反正pBufOut 是个指针,按道理说应该没有问题啊???
不明白!
还有为什么DeviceIoControl(m_hCameraFile, CAM_IOCTL_SAMSUNG_CAM_PR, 0, 0, &pDisplayBuffer, sizeof(BYTE*), 0, 0); pDisplayBuffer本身就是一个指针,直接把指针传进出,不行,为什么非要传个]&pDisplayBuffer???

希望singlerace帮我解答哈!
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
这里要用双指针的,因为要分配内存
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
看了半天双指针的一些东西,被搞糊涂啦!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
这个双指针可以这样理解
一个函数funA 它的参数如果是一个指针,那么你可以在这个指针里面写一些东西,前提示函数外面这个指针对应的空间已经分配。

但是如果你想在你的函数里面进行分配,那么传进来的是指针是不够的,因为这个指针是没有用的,你在函数里面new一块空间之后,会产生一个新的空间,这个新的空间的地址就是你要保存的指针,但是现在由于传进来的是一个指针,你保存的地方只是函数堆栈上面的一个临时变量,函数结束后,这个变量会释放,内存就泄露了,因而如果传进来的是指针的指针,那我们就可以直接把new出来的指针存起来。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
依你目前的情况,还真不知道怎么向你解释清楚。这涉及到参数如何在栈上传递,传值和传址的区别。
建议好好看看C语言函数调用、参数传递、栈,以及指针方面的基本知识。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
3楼正解!
因为你要改pDisplayBuffer本身,所以要把它的地址传过去啊,否则函数会复制一个pDisplayBuffer再处理
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表