如何将DWORD值转换为void * one?

时间:2015-11-27 22:26:55

标签: c++ casting visual-c++-2013

鉴于这些typedef和以下值:

typedef void  GTVOID;
typedef GTVOID *PARAM_VALUE;
typedef unsigned long UDGT32 
typedef UDGT32 PARAM_CONST;
typedef signed long DGT32;
typedef DGT32 RESULT_FUNC;

DWORD value = 1; // given from a define

如何将其转换为满足C ++中设备SDK功能的需求?

RESULT_FUN RSetParam( PARAM_CONST DeviceParameter, PARAM_VALUE value);

样本中的C参考代码是:

RSetParam( R_SOME_PARAM_CONST, (PARAM_VALUE)value );

我在下面尝试过,但这很奇怪。它编译好,全天工作,有些人工作 令人毛骨悚然的运气,开始抛出蓝色的访问违规行为:

RSetParam(R_SOME_PARAM_CONST, reinterpret_cast<void*> (value));

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您已尝试将值1重新解释为地址。根据函数RSetParam对此地址(值)执行的操作,程序可能会出错。特别是,如果它试图写入此地址。

我认为,函数RSetParam等待变量的地址作为第二个参数。变量的类型可能取决于其他内容,也就是说,必须将地址作为void *传递的原因。

因此,如果你想将数字1作为DWORD传递,你必须首先在堆栈上分配一个变量然后传递它的地址:

DWORD tmp = 1; // given from define
RSetParam( R_SOME_PARAM_CONST, (PARAM_VALUE) &tmp ); // note the '&' !