c++ - 如何修改按值传递的原始变量的内容?

标签 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;
}

最佳答案

将要修改的变量放在一个结构中,并将指向该结构的指针传递给插件:

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;
}

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

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

关于c++ - 如何修改按值传递的原始变量的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9938096/

相关文章:

c - 如何用C写 "if x equals 5 or 4 or 78 or..."

c - 堆叠在数据结构中

api - Swift 中的 Youtube API 到 AlamoFire

c++ - 如何设置 GstPlayer 管道?

c++ - union 初始化列表的正确格式是什么?

c++ - #include QtWebKit (Qt4) 或 QtWebKitWidgets (Qt<5.6) 或 QtWebEngineWidgets (Qt>=5.6)

c++ - 在 C++ 中销毁动态分配的内存(数组对象)

c - 唐叶算法 : splitting strings

javascript - ReactJS componentDidMount、Fetch Spotify API 和 Promise

api - 基于 REST API 的 SDK - 开销?