如何修改通过值传递的原始变量的内容?

时间:2012-03-30 06:38:17

标签: c++ c api parameter-passing

现有的API函数只允许插件(DLL)接收三个参数并执行某些操作:

int ProcessMe(int nCommand, unsigned int wParam, long lParam);

现在,从主程序(exe),想要将两个变量传递给插件,并要求插件修改其内容,主程序将再次读取它们,以执行某些任务。

我的问题是,从上面的函数来看,我可以在不更改函数参数的情况下执行此操作吗?

示例:

int ProcessMe(int nCommand, unsigned int wParam, long lParam)
{
  // modify the parameters//
  return 0;
}

int main()
{
  BOOL bSave = TRUE;
  int nOption = 0;
  ProcessMe(0, (unsigned int)(&bSave), (long)(&nOption));
  if(FALSE==bSave)
    printf("bSave is modified!");
  return 1;
}

4 个答案:

答案 0 :(得分:5)

将变量放在struct中进行修改,并将指针传递给插件的sturuct:

struct MyStruct
{
    BOOL bSave;
    int nOption;
};

int ProcessMe(int nCommand, unsigned int wParam, long lParam)
{
    ((MyStruct*)lParam)->nOption = ...;
    return 0;
}

像这样使用:

int main()
{
  MyStruct struct;
  struct.bSave = TRUE;
  struct.nOption = 0;
  ProcessMe(0, 0, (long)(&struct));
  if(FALSE==struct.bSave)
    printf("bSave is modified!");
  return 1;
}

严格来说,这是未定义的行为。您需要检查它是否适用于您的平台。

注意:我在这里使用了一个struct,因为这样你也可以将更多变量或更大的变量(如double)传递给函数。

答案 1 :(得分:3)

不,没有办法做到这一点。

按值传递表示创建原始副本。在方法范围中,您将没有关于原始变量的信息。

您需要通过引用或按值传递。

答案 2 :(得分:1)

试试这个......这是可能的!!!

包括

int ProcessMe(int nCommand,unsigned int wParam,long lParam)

{

int *nCommand_ptr = (int*)nCommand;
unsigned int *wParam_ptr = (unsigned int*)wParam;
long *lParam_ptr = (long*)lParam;
*nCommand_ptr = 10;
*wParam_ptr = 10;
*lParam_ptr = 10;
return 0;

}

int main(){

int nCommand = 5;
unsigned int wParam = 5;
long lParam = 5;
printf("\n %d %u %lu",nCommand,wParam,lParam);
ProcessMe((int)&nCommand,(unsigned int)&wParam,(long)&lParam);
printf("\n %d %u %lu",nCommand,wParam,lParam);
return 0;

}

输出:

$> g ++ passbyref.cc

$> ./ a.out

5 5 5

10 10 10 $>

答案 3 :(得分:1)

编译32位平台,你可以转换为指针参数:

#include <stdio.h>
typedef int BOOL;
#define FALSE 0
#define TRUE 1

int ProcessMe(int nCommand, unsigned int wParam, long lParam)
{
  // cast to match what you passed in
  *((BOOL*)wParam) = FALSE;
  return 0;
}

int cast_arguments_main(int, char **)
{
  BOOL bSave = TRUE;
  int nOption = 0;
  ProcessMe(0, (unsigned int)(&bSave), (long)(&nOption));
  if(FALSE==bSave)
    printf("bSave is modified!");
  return 1;
}

在64位平台上,编译器抱怨无法表示指针:

cast_arguments.cpp:17:37: error: cast from ‘BOOL*’ to ‘unsigned int’ loses precision

我必须将unsigned int wParam参数声明更改为unsigned long wParam,并在呼叫点进行类似更改:ProcessMe(0, (unsigned long)(&bSave), (long)(&nOption)); 但是,您可以简单地为参数声明正确的类型,为BOOL *。因此,可行性取决于您的目标机器架构...