WINCE 编译的时候出现错误 illegal indirection

来源:互联网 发布:直销软件定做公司 编辑:程序博客网 时间:2024/05/16 11:31

 WINCE 编译的时候出现错误  illegal indirection  看了下面的讨论 觉得有点收获

 

wit_scuec:

写了一个按键的驱动,在PB中进行编译的时候,出现了以下错误:
BUILD: [01:0000000022:ERRORE] d:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\Mykey.cpp(511) : error C2440: '=' : cannot convert from 'LPVOID' to 'uchar *'
BUILD: [01:0000000024:PROGC ] Linking D:\WINCE500\platform\mini2440\lib\ARMV4I\retail\MYKEY.lib
BUILD: [01:0000000033:ERRORE] LINK : fatal error LNK1181: cannot open input file 'obj\ARMV4I\retail\Mykey.obj'

错误C2440指向下面程序:
/*******************************************************************************************
函数名称: Key_Read
描 述: 读取按键状态
输入参数: DWORD Handle : 驱动程序引用事例句柄
  LPVOID pBuffer : 接收缓冲区
  DWORD dwNumBytes: 要读的字节数
输出参数: 无
返 回: 实际读到字节数
*******************************************************************************************/
DWORD MYK_Read(DWORD Handle,LPVOID pBuffer,DWORD dwNumBytes)
{
DWORD ret;
uchar* pReadBuffer;


if((pBuffer==NULL)||(dwNumBytes<=0))
return 0;

pReadBuffer=MapPtrToProcess(pBuffer,GetCallerProcess());
*pReadBuffer=0;


RETAILMSG(1,(TEXT("***MYK_read[!!!]!!\r\n")));

  /* 挂起当前线程,直到 KEY 按键按下或驱动关闭 */
ret=WaitForMultipleObjects(2,gReadKeyEvent,FALSE,INFINITE);
if(ret==WAIT_OBJECT_0)
{
ResetEvent(gReadKeyEvent[0]); //按键按下
*pReadBuffer=1;

return 1;
RETAILMSG(1,(TEXT("ResetEvent(gReadKeyEvent[0])")));
}
else if(ret==(WAIT_OBJECT_0+1))
{
ResetEvent(gReadKeyEvent[1]);
*pReadBuffer=0; //驱动关闭
RETAILMSG(1,(TEXT("ResetEvent(gReadKeyEvent[1])")));
return 1;
}
return 0;

}

有三个问题:
1. 程序参考周工的中断流驱动 ,'=' : cannot convert from 'LPVOID' to 'uchar *',出现这种错误的原因是什么呢?如何修改?

2. error LNK1181: cannot open input file 'obj\ARMV4I\retail\Mykey.obj' 编译为什么没有.obj文件呢?
指定目录D:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\obj\ARMV4I\retail下面只有一个_objects.mac文件,文件内容如下:
OBJECTS= \
  obj\ARMV4I\retail\Mykey.obj

PASS0_OBJECTS=

3. 我看了BSP里面的一些驱动程序,发现每一个驱动程序的头文件不一样,对于我这样的新手,想请教下编写驱动时,头文件的编写应该注意哪些?如何查找需要的头文件?

感谢读帖,感谢指教!

 

LoongEmbedded:

1. 程序参考周工的中断流驱动 ,'=' : cannot convert from 'LPVOID' to 'uchar *',出现这种错误的原因是什么呢?如何修改?

--->511行是指pReadBuffer=MapPtrToProcess(pBuffer,GetCallerProcess());
这一行吧,因为MapPtrToProcess函数的返回值的类型是LPVOID,所以楼主把下面的定义:
uchar* pReadBuffer;
改为
LPVOID pReadBuffer;

2. error LNK1181: cannot open input file 'obj\ARMV4I\retail\Mykey.obj' 编译为什么没有.obj文件呢?
指定目录D:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\obj\ARMV4I\retail下面只有一个_objects.mac文件,文件内容如下:
OBJECTS= \
  obj\ARMV4I\retail\Mykey.obj

PASS0_OBJECTS=

---》因为你这个驱动因为编译出错,所以不会生成目标文件,这是正常的,只要编译通过了,就可以生产目标文件了。

3. 我看了BSP里面的一些驱动程序,发现每一个驱动程序的头文件不一样,对于我这样的新手,想请教下编写驱动时,头文件的编写应该注意哪些?如何查找需要的头文件?

--->因为不同的驱动用到的函数不一样,所以包含的头文件不一样,驱动自己的头文件一般是用于声明函数,定义结构体,定义宏等本驱动所需要的。

 

wit_scuec:

 

MapPtrToProcess函数的返回值的类型是LPVOID,这个我知道,我昨晚把uchar* pReadBuffer改为 LPVOID pReadBuffer; 但是改过之后出现下面的问题:
*pReadBuffer=MapPtrToProcess(pBuffer,GetCallerProcess());  
这个语句:
BUILD: [01:0000000022:ERRORE] d:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\Mykey.cpp(511) : error C2100: illegal indirection

*pReadBuffer=0;
这个语句:
BUILD: [01:0000000023:ERRORE] d:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\Mykey.cpp(512) : error C2100: illegal indirection

*pReadBuffer=1;
这个语句:
BUILD: [01:0000000024:ERRORE] d:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\Mykey.cpp(522) : error C2100: illegal indirection
BUILD: [01:0000000025:ERRORE] d:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\Mykey.cpp(522) : error C2440: '=' : cannot convert from 'int' to 'LPVOID'

这个语句:
*pReadBuffer=0;
BUILD: [01:0000000027:ERRORE] d:\WINCE500\PLATFORM\mini2440\Src\Drivers\Mykey\Mykey.cpp(530) : error C2100: illegal indirection


  该段程序主要调用等待多事件函数WaitForMultipleObjects()等待事件gReadKeyEvent生效,当gReadKeyEvent[0]有效时,返回1字节,该字节值为1;如果WaitForMultipleObjects()等待的事件是gReadKeyEvent[1](本驱动关闭或卸载),则返回一字节,但该字节的值为0 。
  怎样才能编译通过呢?

 

LoongEmbedded:

改成那样后,*pReadBuffer=0; *pReadBuffer=1; 把实变量当一个指针赋值,出现error C2100: illegal indirection 错误。
 
 
很奇怪,我把楼主上面的一部分代码放在我的DSK_Read函数中,如下,编译可以通过的啊,楼主上面的511行是指哪一行代码啊?
DWORD DSK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
DWORD ret;
uchar* pReadBuffer;


if((pBuffer==NULL)||(dwNumBytes<=0))
return 0;

pReadBuffer=MapPtrToProcess(pBuffer,GetCallerProcess());
*pReadBuffer=(LPVOID *)0;
return 0;
}
 
 

wit_scuec:

511行指的是 pReadBuffer=MapPtrToProcess(pBuffer,GetCallerProcess());这一行,呵呵,我上午思考了下把它改过来了。

LPVOID MapPtrToProcess( 
  LPVOID lpv, 
  HANDLE hProc 
);

  MapPtrToProcess 返回的是LPVOID,一个没有类型的指针,而程序里面定义的pReadBuffer是uchar*型,编译的时候出现pReadBuffer=MapPtrToProcess(pBuffer,GetCallerProcess());'=' : cannot convert from 'LPVOID' to 'uchar *',的错误,周工的参考代码并没有进行强制类型转换,但是我在PB上编译时候会报错,实际上还是类型不匹配的问题,我将程序做了如下修改 :
 pReadBuffer=(uchar*)MapPtrToProcess(pBuffer,GetCallerProcess()); 使得MapPtrToProcess函数的返回值强制为uchar* ,与pReadBuffer定义向匹配。

 编译就通过了

原帖地址:http://topic.csdn.net/u/20071127/11/3a729150-d1c8-48ed-8c12-59ba215bf4ea.html
原创粉丝点击