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

wen*_*eng 5 c c++ api parameter-passing

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

int ProcessMe(int nCommand, unsigned int wParam, long lParam);
Run Code Online (Sandbox Code Playgroud)

现在,从主程序(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;
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*rik 5

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

struct MyStruct
{
    BOOL bSave;
    int nOption;
};

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

像这样使用它:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @LuchianGrigore - 当然!目的是修改结构的内容. (2认同)